

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

# 使用 AWS SAMCLI 发布应用程序
<a name="serverless-sam-template-publishing-applications"></a>

要让其他人可以查找和部署您的 AWS SAM 应用程序，您可以使用将其发布 AWS SAMCLI到 AWS Serverless Application Repository。要使用发布应用程序 AWS SAMCLI，必须使用 AWS SAM 模板对其进行定义。您还必须已在本地或 AWS Cloud 中对应用程序进行了测试。

按照本主题中的说明创建新应用程序，创建现有应用程序的新版本，或更新现有应用程序的元数据。（您的操作取决于应用程序是否已存在于中 AWS Serverless Application Repository，以及是否有任何应用程序元数据正在更改。） 有关应用程序元数据的更多信息，请参阅 [AWS SAM 模板元数据部分属性](serverless-sam-template-publishing-applications-metadata-properties.md)。

## 先决条件
<a name="serverless-sam-template-publishing-applications-prerequisites"></a>

在 AWS Serverless Application Repository 使用向发布应用程序之前 AWS SAMCLI，必须具备以下条件：
+  AWS SAM CLI 已安装。有关更多信息，请参阅 [安装 AWS SAM CLI](install-sam-cli.md)。要确定是否安装了 AWS SAM CLI，请运行以下命令：

  ```
  sam --version
  ```
+ 有效的 AWS SAM 模板。
+  AWS SAM 模板引用的应用程序代码和依赖关系。
+ 语义版本，仅在公开共享应用程序时才需要。此值可以像 1.0 那么简单。
+ 指向应用程序源代码的 URL。
+ 一个 `README.md` 文件。此文件应描述客户如何使用您的应用程序，以及如何在将其部署到自己的 AWS 账户之前对其进行配置。
+ `LICENSE.txt` 文件，仅在公开共享应用程序时才需要。
+ 如果您的应用程序包含任何嵌套应用程序，则这些嵌套应用程序必须已发布到 AWS Serverless Application Repository。
+ 一个有效的 Amazon Simple Storage Service (Amazon S3)存储桶策略，它为在您打包应用程序时上传到 Amazon S3 的构件授予服务读取权限。要设置此策略，请执行以下操作：

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

  1. 选择用于打包您的应用程序的 Amazon S3 存储桶的名称。

  1. 选择**权限**。

  1. 在 **Permissions**（权限）标签页中，在 **Bucket policy**（存储桶策略）下，请选择 **Edit**（编辑）。

  1. 在**编辑存储桶策略**页面中，将以下策略声明粘贴到**策略**编辑器中。在策略声明中，请确保在 `Resource` 元素中使用存储桶名称，并且在 `Condition` 元素中使用 AWS 账户 ID。`Condition`元素中的表达式可确保仅 AWS Serverless Application Repository 有权访问来自指定 AWS 账户的应用程序。有关策略声明的更多信息，请参阅*《IAM 用户指南》*中的 [IAM JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
             {
                 "Effect": "Allow",
                 "Principal": {
                     "Service":  "serverlessrepo.amazonaws.com"
                 },
                 "Action": "s3:GetObject",
                 "Resource": "arn:aws:s3:::<your-bucket-name>/*",
                 "Condition" : {
                     "StringEquals": {
                         "aws:SourceAccount": "123456789012"
                     }
                 }
             }
         ]
     }
     ```

------

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

## 发布新应用程序
<a name="serverless-sam-template-publishing-applications-new-app"></a>

### 第 1 步：向 AWS SAM 模板添加分`Metadata`区
<a name="serverless-sam-template-publishing-applications-step1"></a>

首先，在 AWS SAM 模板中添加一个`Metadata`部分。提供要发布到 AWS Serverless Application Repository的应用程序信息。

下面是 `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

Resources:
  HelloWorldFunction:
    Type: AWS::Lambda::Function
      Properties:
        ...
        CodeUri: source-code1
        ...
```

有关 AWS SAM 模板`Metadata`部分的更多信息，请参阅[AWS SAM 模板元数据部分属性](serverless-sam-template-publishing-applications-metadata-properties.md)。

### 第 2 步：打包应用程序
<a name="serverless-sam-template-publishing-applications-step2"></a>

运行以下 AWS SAM CLI 命令，将应用程序的构件上传到 Amazon S3，并输出名为 `packaged.yaml` 的新模板文件：

```
sam package --output-template-file packaged.yaml --s3-bucket <your-bucket-name>
```

在下一步中，要使用 `packaged.yaml` 模板文件将应用程序发布到 AWS Serverless Application Repository。此文件与原始模板文件 (`template.yaml`) 类似，但具有一个重要区别：`CodeUri`、`LicenseUrl` 和 `ReadmeUrl` 属性指向包含相应构件的 Amazon S3 存储桶和对象。

来自示例 `packaged.yaml` 模板文件的以下代码段显示了 `CodeUri` 属性：

```
MySampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://bucketname/fbd77a3647a4f47a352fcObjectGUID

...
```

### 第 3 步：发布应用程序
<a name="serverless-sam-template-publishing-applications-step3"></a>

要将 AWS SAM 应用程序的私有版本发布到 AWS Serverless Application Repository，请运行以下 AWS SAMCLI命令：

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

`sam publish` 命令的输出包括指向 AWS Serverless Application Repository上的应用程序的链接。您也可以转到[AWS Serverless Application Repository 登录页面](https://serverlessrepo.aws.amazon.com/applications)并搜索您的应用程序。

### 第 4 步：共享应用程序（可选）
<a name="serverless-sam-template-publishing-applications-step4"></a>

默认情况下，您的应用程序设置为私有，因此其他 AWS 账户看不到您的应用程序。要与他人共享您的应用程序，您必须将其公开或向特定的 AWS 账户列表授予权限。

有关使用共享应用程序的信息 AWS CLI，请参阅《*AWS Serverless Application Repository 开发人员指南》*中的[AWS Serverless Application Repository 基于资源的策略示例](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/security_iam_resource-based-policy-examples.html)。有关使用 AWS 管理控制台共享应用程序的信息，请参阅《AWS Serverless Application Repository 开发人员指南》**中的[共享应用程序](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-how-to-publish.html#share-application)。

## 发布现有应用程序的新版本
<a name="serverless-sam-template-publishing-applications-new-version"></a>

在将应用程序发布到之后 AWS Serverless Application Repository，您可能需要发布该应用程序的新版本。例如，您可能更改了 Lambda 函数代码或向应用程序架构添加了新组件。

要更新您之前发布的应用程序，请使用前面详述的相同流程再次发布该应用程序。在 AWS SAM 模板文件的 `Metadata` 部分，提供您最初发布应用程序时使用的应用程序名称，但名称要包含一个新的 `SemanticVersion` 值。

例如，假设发布的应用程序的名称为 `SampleApp`，并且 `SemanticVersion` 为 `1.0.0`。要更新该应用程序， AWS SAM 模板必须包含应用程序名称 `SampleApp` 和 `SemanticVersion` `1.0.1`（或除 `1.0.0` 之外的任何版本）。

## 其他主题
<a name="serverless-sam-template-publishing-applications-additional-topics"></a>
+ [AWS SAM 模板元数据部分属性](serverless-sam-template-publishing-applications-metadata-properties.md)