

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程：创建将您的无服务器应用程序发布到的管道 AWS Serverless Application Repository
<a name="tutorials-serverlessrepo-auto-publish"></a>

您可以使用 AWS CodePipeline 将您的 AWS SAM 无服务器应用程序持续交付给。 AWS Serverless Application Repository

**重要**  
作为创建管道的一部分，客户提供的 S3 工件存储桶将 CodePipeline 用于项目。（这与用于 S3 源操作的存储桶不同。） 如果 S3 工件存储桶与您的管道账户位于不同的账户中，请确保 S3 工件存储桶归其所有 AWS 账户 ，该存储桶是安全且可靠的。

本教程介绍如何创建和配置管道来构建托管的无服务器应用程序并将其 AWS Serverless Application Repository 自动发布到。 GitHub 管道 GitHub 用作源提供者和 CodeBuild 生成提供者。要将您的无服务器应用程序发布到 AWS Serverless Application Repository，您需要部署一个[应用程序（来自 AWS Serverless Application Repository），并将该应用程序](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~aws-serverless-codepipeline-serverlessrepo-publish )创建的 Lambda 函数关联为管道中的 Invoke 操作提供者。然后，您无需编写任何代码即可持续向 AWS Serverless Application Repository提供应用程序更新。

**重要**  
在此过程中，您在管道中添加的许多操作都涉及在创建管道之前需要创建的 AWS 资源。 AWS 源操作的资源必须始终在您创建管道的同一 AWS 区域创建。例如，如果您在美国东部（俄亥俄州）地区创建管道，则您的 CodeCommit 存储库必须位于美国东部（俄亥俄州）区域。  
您可以在创建管道时添加跨区域操作。 AWS 跨区域操作的资源必须位于您计划执行操作的同一 AWS 区域。有关更多信息，请参阅 [在中添加跨区域操作 CodePipeline](actions-create-cross-region.md)。

## 开始前的准备工作
<a name="tutorials-serverlessrepo-auto-publish-prereq"></a>

在本教程中，我们假设您满足以下条件：
+ 您熟悉[AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/) 和 [AWS Serverless Application Repository](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/)。
+ 您在中托管了一个无服务器应用程序 GitHub ，并已 AWS Serverless Application Repository 使用 AWS SAM CLI 将其发布到。要向发布示例应用程序 AWS Serverless Application Repository，请参阅《*AWS Serverless Application Repository 开发人员指南》*中的 “[快速入门：发布应用程序](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-quick-start.html)”。要将自己的应用程序[发布到 AWS Serverless Application Repository，请参阅《*AWS Serverless Application Model 开发者指南》*中的 “使用 AWS SAM CLI 发布应用程序](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html)”。

## 步骤 1：创建 buildspec.yml 文件
<a name="serverlessrepo-auto-publish-create-buildspec"></a>

创建包含以下内容的`buildspec.yml`文件，并将其添加到无服务器应用程序的 GitHub 存储库中。*template.yml*替换为应用程序的 AWS SAM 模板和*bucketname*存储打包应用程序的 S3 存储桶。

```
version: 0.2
phases:
  install:
    runtime-versions:
        python: 3.8
  build:
    commands:
      - sam package --template-file template.yml --s3-bucket bucketname --output-template-file packaged-template.yml
artifacts:
  files:
    - packaged-template.yml
```

## 步骤 2：创建并配置您的管道
<a name="serverlessrepo-auto-publish-create-pipeline"></a>

按照以下步骤在要发布无服务器应用程序的 AWS 区域 位置创建管道。

1. 登录 AWS 管理控制台 并打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

1. 如有必要，请切换到要发布无服务器应用程序 AWS 区域 的位置。

1. 在**欢迎**页面、**入门**页面或**管道**页面上，选择**创建管道**。

1. 在**步骤 1：选择创建选项**页面上的**创建选项**下，选择**构建自定义管道**选项。选择**下一步**。

1. 选择 **Create pipeline（创建管道）**。在**步骤 2：选择管道设置**页面上，在**管道名称**中，输入管道的名称。

1. 在**管道类型**中，选择 **V2**。有关更多信息，请参阅 [管道类型](pipeline-types.md)。选择**下一步**。

1. 在**服务角色**中，选择**新建服务角色** CodePipeline 以允许在 IAM 中创建服务角色。

1. 将**高级设置**中的各项设置保留为默认值，然后选择**下一步**。

1. 在 “**步骤 3：添加源舞台**” 页面上，在**源提供程序**中，选择**GitHub**。

1. 在**连接**下，选择一个现有连接或创建一个新连接。要创建或管理 GitHub 源操作的连接，请参阅[GitHub 连接](connections-github.md)。

1. 在**存储库**中，选择您的 GitHub 源存储库。

1. 在 **Branch** 中，选择您的 GitHub 分支。

1. 保留源操作的其余默认值。选择**下一步**。

1. 在**步骤 4：添加构建阶**页面上，添加一个构建阶段：

   1. 在**构建提供程序**中，选择 **AWS CodeBuild**。对于 **Region (区域)**，请使用管道区域。

   1. 选择**创建项目**。

   1. 在**项目名称**中，输入此构建项目的名称。

   1. 在**环境映像**中，选择**托管映像**。对于**操作系统**，请选择 **Ubuntu**。

   1. 对于 **Runtime (运行时)** 和 **Runtime version (运行时版本)**，选择无服务器应用程序所需的运行时和版本。

   1. 对于**服务角色**，选择**新建服务角色**。

   1. 对于**构建规范**，选择**使用 buildspec 文件**。

   1. 选择 “**继续” CodePipeline**。这将打开 CodePipeline 控制台并创建一个使用存储库`buildspec.yml`中的进行配置的 CodeBuild 项目。该构建项目使用服务角色来管理 AWS 服务 权限。此步骤可能需要几分钟时间。

   1. 选择**下一步**。

1. 在**步骤 5：添加测试阶段**中，选择**跳过测试阶段**，并通过再次选择**跳过**接受警告消息。

   选择**下一步**。

1. 在 “**步骤 6：添加部署阶段**” 页上，选择 “**跳过部署阶段**”，然后再次选择 “**跳过**”，接受警告消息。选择**下一步**。

1. 在 “**步骤 7：查看**” 中，选择 “**创建管道**”。您应该可以看到一个显示阶段的示意图。

1. 向 CodeBuild 服务角色授予访问存储打包应用程序的 S3 存储桶的权限。

   1. 在新管道的 **Build (构建)** 阶段，选择 **CodeBuild**。

   1. 选择 **Build details (构建详细信息)** 选项卡。

   1. 在**环境**中，选择 CodeBuild 服务角色以打开 IAM 控制台。

   1. 展开 `CodeBuildBasePolicy` 选项，然后选择 **Edit policy (编辑策略)**。

   1. 选择 **JSON**。

   1. 添加包含以下内容的新策略声明。该语句 CodeBuild 允许将对象放入存储已打包应用程序的 S3 存储桶中。*bucketname*替换为您的 S3 存储桶的名称。

      ```
              {
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:s3:::bucketname/*"
                  ],
                  "Action": [
                      "s3:PutObject"
                  ]
              }
      ```

   1. 选择**查看策略**。

   1. 选择**保存更改**。

## 步骤 3：部署发布应用程序
<a name="serverlessrepo-auto-publish-deploy-app"></a>

按照以下步骤部署包含 Lambda 函数的应用程序，该函数执行到 AWS Serverless Application Repository的发布操作。此应用程序是 **aws-serverless-codepipeline-serverlessrepo-pub** lish。

**注意**  
您必须将应用程序部署到与您的管道 AWS 区域 相同的位置。

1. 转到[应用程序](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~aws-serverless-codepipeline-serverlessrepo-publish )页面，然后选择 **Deploy (部署)**。

1. 选择 **I acknowledge that this app creates custom IAM roles (我确认此应用程序创建自定义 IAM 角色)**。

1. 选择**部署**。

1. 选择 “**查看 CloudFormation 堆栈**” 以打开 CloudFormation 控制台。

1. 展开**资源**部分。你看 **ServerlessRepoPublish**，属于这种类型**AWS::Lambda::Function**。记下此资源的物理 ID 以供下一步使用。您在 CodePipeline 中创建新的发布操作时将会用到此物理 ID。

## 步骤 4：创建发布操作
<a name="serverlessrepo-auto-publish-create-action"></a>

请按照以下步骤在管道中创建发布操作。

1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

1. 在左侧导航部分中，选择要编辑的管道。

1. 选择**编辑**。

1. 在当前管道的最后一个阶段之后，选择 **\$1 Add stage (\$1 添加阶段)**。在 **Stage name (阶段名称)** 中，输入名称，例如 **Publish**，然后选择 **Add stage (添加阶段)**。

1. 在新阶段中，选择 **\$1 添加操作组**。

1. 输入操作名称。从 **Action provider (操作提供程序)** 的 **Invoke (调用)** 中，选择 **AWS Lambda**。

1. 从**输入构件**中选择**BuildArtifact**。

1. 从**函数名称**中，选择您在上一步中记下的 Lambda 函数的物理 ID。

1. 对操作选择 **Save (保存)**。

1. 对阶段选择 **Done (完成)**。

1. 在右上角，选择 **Save (保存)**。

1. 要验证您的管道，请在中更改您的应用程序 GitHub。例如，更改 AWS SAM 模板文件`Metadata`部分中应用程序的描述。提交更改并将其推送到您的 GitHub 分支。这将触发您的管道运行。管道完成后，检查您的应用程序是否已根据 [AWS Serverless Application Repository](https://console.aws.amazon.com/serverlessrepo/home) 中的更改进行了更新。