

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

# 快速入门：发布应用程序
<a name="serverlessrepo-quick-start"></a>

本指南将引导您完成下载、构建、测试示例无服务器应用程序并将其发布到 AWS Serverless Application Repository 使用 AWS SAM CLI 的步骤。您可以使用此示例应用程序作为开发和发布自己的无服务器应用程序的起点。

## 概述
<a name="serverlessrepo-quick-start-steps"></a>

以下步骤概述如何下载、构建和发布示例无服务器应用程序：

1. **初始化**。使用 `sam init` 从模板下载示例应用程序。

1. **本地测试**。使用在本地测试应用程序`sam local invoke` and/or `sam local start-api`。请注意，使用这些命令，即使您的 Lambda 函数是在本地调用的，它也会从云中的 AWS 资源中读取和写入数据。 AWS 

1. **程序包**。如果您对 Lambda 函数感到满意，请使用将 Lambda 函数、 AWS SAM 模板和任何依赖项捆绑到部署包中。 CloudFormation `sam package`在此步骤中，您还将包含有关将上传到 AWS Serverless Application Repository的应用程序的信息。

1. **发布**。使用 `sam publish` 将应用程序发布到 AWS Serverless Application Repository 。完成此步骤后，您可以使用查看您的应用程序 AWS Serverless Application Repository 并将其部署到 AWS 云端 AWS Serverless Application Repository。

下一节中的示例[Hello World 应用程序](#serverlessrepo-quick-start-hello-world)将指导您完成构建和发布无服务器应用程序的这些步骤。

## Hello World 应用程序
<a name="serverlessrepo-quick-start-hello-world"></a>

在本练习中，您将下载并测试代表简单 API 后端的 Hello World 无服务器应用程序。它有一个支持 GET 操作的 Amazon API Gateway 终端节点和 Lambda 函数。当向终端节点发送 GET 请求时，API Gateway 会调用 Lambda 函数。然后， AWS Lambda 执行该函数，该函数仅返回一条`hello world`消息。

该应用程序具有以下组件：
+ 一个为 Hello World 应用程序定义两个 AWS 资源的 AWS SAM 模板：带有 GET 操作的 API Gateway 服务和一个 Lambda 函数。该模板还定义了 API Gateway GET 操作和 Lambda 函数之间的映射。
+ 用 Python 编写的应用程序代码。

## 开始前的准备工作
<a name="serverlessrepo-quick-start-hello-world-prereq"></a>

请确保您具有本练习所需的设置：
+ 您必须拥有一个拥有管理员权限的 IAM 用户的 AWS 账户。请参阅[设置 AWS 账户](https://docs.aws.amazon.com/lambda/latest/dg/setup.html)。
+ 您必须安装 AWS SAM CLI（命令行界面）。请参见[安装 C AWS SAM LI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)。
+ 必须安装版本 1.16.77 或更高版本。 AWS CLI 请参阅[安装 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。

## 步骤 1：初始化应用程序
<a name="serverlessrepo-quick-start-hello-world-setup-local-app"></a>

在本节中，您将下载示例应用程序，其中包括 AWS SAM 模板和应用程序代码。

**初始化应用程序**

1. 在 AWS SAM CLI 命令提示符下运行以下命令。

   ```
   sam init --runtime python3.6 
   ```

1. 查看命令创建的目录的内容 (`sam-app/`)：
   + `template.yaml`— 定义 Hello World 应用程序所需的两个 AWS 资源：一个 Lambda 函数和一个支持 GET 操作的 API Gateway 终端节点。模板还定义了两个资源之间的映射。
   + 与 Hello World 应用程序代码相关的内容：
     + `hello_world/`directory-包含应用程序代码，该代码`hello world`将在您运行时返回。
**注意**  
在本练习中，应用程序代码是用 Python 编写的，你可以在`init`命令中指定运行时间。 AWS Lambda 支持用于创建应用程序代码的其他语言。如果您指定了另一个受支持的运行时，`init` 命令将以指定的语言提供 Hello World 代码，以及一个您可以遵循该语言的 `README.md` 文件。有关支持的运行时的信息，请参阅 [Lambda 执行环境和可用库](https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)。

    

## 步骤 2：在本地测试应用程序
<a name="serverlessrepo-quick-start-hello-world-test-locally"></a>

现在，您已经在本地计算机上安装了该 AWS SAM 应用程序，请按照以下步骤在本地对其进行测试。



**在本地测试应用程序**

1. 在本地启动 API 网关终端节点。您必须从包含该 `template.yaml` 文件的目录运行以下命令。

   ```
   sam-app> sam local start-api --region us-east-1
   ```

   该命令返回 API Gateway 终端节点，您可以向其发送请求以进行本地测试。

1. 测试应用程序。复制 API Gateway 端点 URL，将其粘贴到浏览器中，然后选择 **Enter**。API Gateway 终端节点网址示例如`http://127.0.0.1:3000/hello`下。

   API Gateway 在本地调用终端节点映射到的 Lambda 函数。Lambda 函数在本地 Docker 容器中执行并返回。`hello world`API Gateway 会向浏览器返回包含该文本的响应。

**练习：更改消息字符串**

成功测试示例应用程序后，您可以尝试进行简单的修改：更改返回的消息字符串。

1. 编辑 `/hello_world/app.py` 文件以将消息字符串从 `'hello world'` 更改为 `'Hello World!'`。

1. 在浏览器中重新加载测试 URL 并观察新字符串。

您会注意到您的新代码是动态加载的，而无需重新启动 `sam local` 进程。

## 步骤 3：打包应用程序
<a name="serverlessrepo-quick-start-hello-world-package-app"></a>

在本地测试应用程序后，您可以使用 AWS SAM CLI 创建部署包和打包 AWS SAM 模板。

**注意**  
在以下步骤中，您将为包含应用程序代码的 `hello_world/` 目录的内容创建一个 .zip 文件。此 .zip 文件是无服务器应用程序的**部署包**。有关更多信息，请参阅《*AWS Lambda 开发者指南》*中的[创建部署包 (Python)](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html)。

**要创建 Lambda 部署包**

1. 在 AWS SAM 模板文件中添加一个`Metadata`部分，提供所需的应用程序信息。有关 AWS SAM 模板`Metadata`部分的更多信息，请参阅《*AWS Serverless Application Model 开发者指南》*中的 “[AWS SAM 模板元数据节属性”](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications-metadata-properties.html)。

   以下是一个示例 `Metadata` 部分：

   ```
   Metadata:
     AWS::ServerlessRepo::Application:
       Name: {{my-app}}
       Description: {{hello world}}
       Author: {{user1}}
       SpdxLicenseId: Apache-2.0
       LicenseUrl: {{LICENSE.txt}}
       ReadmeUrl: {{README.md}}
       Labels: {{['tests']}}
       HomePageUrl: {{https://github.com/user1/my-app-project}}
       SemanticVersion: {{0.0.1}}
       SourceCodeUrl: {{https://github.com/user1/my-app-project}}
   ```

   `LicenseUrl`和`ReadmeUrl`属性可以是对本地文件的引用（如上例所示），也可以是指向已经托管这些项目的 Amazon S3 存储桶的链接。

1. 在要保存打包代码的位置创建 S3 存储桶。如果要使用现有 S3 存储桶，请跳过此步骤。

   ```
   sam-app> aws s3 mb s3://{{bucketname}}
   ```

1. 通过运行以下 CL `package` AWS SAM I 命令创建 Lambda 函数部署包。

   ```
   sam-app> sam package \
       --template-file template.yaml \
       --output-template-file packaged.yaml \
       --s3-bucket {{bucketname}}
   ```

   此命令执行以下操作：
   + 压缩`aws-sam/hello_world/`目录的内容并将其上传到 Amazon S3。
   + 将部署包、自述文件和许可证文件上传到选项指定的 Amazon S3 存储桶。`--s3-bucket`
   + 输出一个名为 `packaged.yaml` 的新模板文件，您在下一步使用该文件将应用程序发布到 AWS Serverless Application Repository。该`packaged.yaml`模板文件与原始模板文件 (`template.yaml`) 类似，但有一个关键区别—— `CodeUri`、`LicenseUrl`、和`ReadmeUrl`属性指向包含相应项目的 Amazon S3 存储桶和对象。来自示例 `packaged.yaml` 模板文件的以下代码段显示了 `CodeUri` 属性：

     ```
     HelloWorldFunction:
         Type: AWS::Serverless::Function # For more information about function resources, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
         Properties:
           CodeUri: s3://{{bucketname}}/{{fbd77a3647a4f47a352fcObjectGUID}}
     
     ...
     ```

## 步骤 4：发布应用程序
<a name="serverlessrepo-quick-start-hello-world-publish-app"></a>

既然您已创建部署包，就可以使用它将应用程序发布到 AWS Serverless Application Repository。

**将无服务器应用程序发布到 AWS Serverless Application Repository**
+ 执行以下命令以在 AWS Serverless Application Repository 中发布新应用程序，并将第一个版本创建为 0.0.1。

  ```
  sam-app> sam publish \
      --template packaged.yaml \
      --region us-east-1
  ```

**注意**  
默认情况下，应用程序将创建为私有应用程序。您必须先共享该应用程序，然后才能允许其他 AWS 账户查看和部署您的应用程序。有关共享应用程序的更多详细信息，请参阅下面的 **Next Steps (后续步骤)**。

## 后续步骤
<a name="serverlessrepo-quick-start-nextstep"></a>

现在，您已经发布了示例应用程序，以下是您可能需要对其执行的几项操作。
+ **查看您的应用程序 AWS Serverless Application Repository** — `sam publish` 命令的输出将包括一个 AWS Serverless Application Repository 直接指向您的应用程序详情页面的链接。您也可以前往 AWS Serverless Application Repository 登录页面并搜索您的应用程序。
+ **共享您的应用程序**-由于您的应用程序在默认情况下设置为私有，因此其他 AWS 账户无法看到该应用程序。为了与他人共享您的应用程序，您必须将其公开，或者向特定的 AWS 账户列表授予权限。有关使用共享应用程序的信息， AWS CLI 请参阅[AWS Serverless Application Repository 应用程序策略示例](security_iam_resource-based-policy-examples.md)。有关使用控制台共享应用程序的信息，请参阅[共享应用程序](serverlessrepo-how-to-publish.md#share-application)。

## 更多信息
<a name="serverlessrepo-quick-start-moreinfo"></a>

有关 AWS SAM 模板`Metadata`部分`sam package`和 AWS SAM CLI `sam publish` 命令的更多信息，请参阅《*AWS Serverless Application Model 开发人员指南》*中的 “[使用 AWS SAM CLI 发布应用程序](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-publishing-applications.html)”。