教程:部署 Hello World 应用程序 - Amazon Serverless Application Model
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

教程:部署 Hello World 应用程序

在本指南中,您可以使用 Hello World 下载、构建和部署示例 Hello World 应用程序,Amazon SAM。然后,您可以在Amazon云,并可选择在您的开发主机上进行本地测试。

此应用程序实现了一个基本的 API 后端。它包含 Amazon API Gateway 终端节点和Amazon Lambdafunction. 向 API Gateway 终端节点发送 GET 请求时,Lambda 函数将调用 Lambda 函数。此函数返回一个hello world消息。

下图显示此应用程序的组件:


      向 API Gateway 终端节点发送 GET 请求时调用的 Lambda 函数的图表。

初始化示例应用程序时,您可以选择 Lambda 部署包类型,Zip或者Image。有关包类型的更多信息,请参阅Lambda 部署程序包中的Amazon Lambda开发人员指南

以下是为创建 Hello World 应用程序而运行的命令的预览。有关其中每个命令的更多信息,请参阅本教程后面的各个部分。

#Step 1 - Download a sample application sam init #Step 2 - Build your application cd sam-app sam build #Step 3 - Deploy your application sam deploy --guided

Prerequisites

本指南假定您已完成操作系统安装 Amazon SAM CLI,包括:

  1. 创建Amazonaccount.

  2. 配置Amazon Identity and Access Management(IAM) 权限。

  3. 安装 Docker。注意: Docker 只是在本地测试应用程序的先决条件。

  4. 安装 Homebrew。注意: 自制软件只是 Linux 和 macOS 的先决条件。

  5. 安装Amazon SAM命令行界面 (CLI)。注意: 请确保您具有版本 1.13.0 或更高版本。通过运行sam --version命令。

  6. 如果选择Image包类型,具有 Amazon Elastic Container Registry (Amazon ECR) 存储库 URI 以执行部署。

第 1 步:下载示例Amazon SAM应用程序

要运行的命令:

sam init

按照屏幕上的提示操作。在本教程中,我们建议您选择Amazon Quick Start TemplatesZip包类型、您选择的运行时以及Hello World Example

输出示例:

   
 -----------------------
 Generating application:
 -----------------------
 Name: sam-app
 Runtime: python3.7
 Dependency Manager: pip
 Application Template: hello-world
 Output Directory: .

 Next steps can be found in the README file at ./sam-app/README.md
        

什么是Amazon SAM正在执行:

此命令使用您作为项目名称提供的名称创建一个目录。项目目录的内容类似于以下内容:

 
 sam-app/
   ├── README.md
   ├── events/
   │   └── event.json
   ├── hello_world/
   │   ├── __init__.py
   │   ├── app.py            #Contains your Amazon Lambda handler logic.
   │   └── requirements.txt  #Contains any Python dependencies the application requires, used for sam build
   ├── template.yaml         #Contains the Amazon SAM template defining your application's Amazon resources.
   └── tests/
       └── unit/
           ├── __init__.py
           └── test_handler.py
        
注意

这些项目目录内容是在您选择其中一个 Python 运行时和Hello World Example

有三个特别重要的文件:

  • template.yaml:包含Amazon SAM模板,定义应用程序的Amazon资源的费用。

  • hello_world/app.py:包含实际的 Lambda 处理程序逻辑。

  • hello_world/requirements.txt:包含应用程序需要的任何 Python 依赖关系,并用于sam build

第 2 步:构建您的应用程序

要运行的命令:

首先,切换到项目目录,其中template.yaml文件,以便找到示例应用程序。(默认情况下,此目录为sam-app。) 然后运行以下命令:

sam build

输出示例:

  
 Build Succeeded

 Built Artifacts  : .aws-sam/build
 Built Template   : .aws-sam/build/template.yaml

 Commands you can use next
 =========================
 [*] Invoke Function: sam local invoke
 [*] Deploy: sam deploy --guided
       

什么是Amazon SAM正在执行:

这些区域有:Amazon SAMCLI 提供多个 Lambda 运行时的抽象,以构建您的依赖项,并将源代码复制到暂存文件夹中,以便所有内容都准备好打包和部署。这些区域有:sam build命令将构建您的应用程序具有的任何依赖项,并将您的应用程序源代码复制到.aws-sam/build以压缩并上传到 Lambda。

您可以在下面的顶级树.aws-sam

 
 .aws-sam/
   └── build/
       ├── HelloWorldFunction/
       └── template.yaml
            

HelloWorldFunction是一个包含app.py文件以及应用程序使用的第三方依赖关系。

第 3 步:将应用程序部署到Amazon云

要运行的命令:

sam deploy --guided

按照屏幕上的提示操作。要接受交互式体验中提供的默认选项,请使用Enter。如果您选择了Image软件包类型时,系统会提示您输入 Amazon ECR 存储库。要部署您的无服务器应用程序,请提供有效的 Amazon ECR 存储库 URI。

注意

对于提示HelloWorldFunction may not have authorization defined, Is this okay? [y/N]、Amazon SAM通知您示例应用程序在未经授权的情况下配置 API Gateway API。部署示例应用程序时,Amazon SAM创建一个公开可用的 URL。

您可以通过对提示回答 “Y” 来确认此通知。有关配置授权的信息,请参阅控制对 API Gateway API 的访问

输出示例:

 
    Deploying with following values
    ===============================
    Stack name                 : sam-app
    Region                     : us-east-1
    Confirm changeset          : False
    Deployment s3 bucket       : sam-bucket
    Capabilities               : ["CAPABILITY_IAM"]
    Parameter overrides        : {}

 Initiating deployment
 =====================

 Waiting for changeset to be created..

 CloudFormation stack changeset
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 Operation                                         LogicalResourceId                                 ResourceType
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 + Add                                             HelloWorldFunctionHelloWorldPermissionProd        AWS::Lambda::Permission
 + Add                                             ServerlessRestApiDeployment47fc2d5f9d             AWS::ApiGateway::Deployment
 + Add                                             ServerlessRestApiProdStage                        AWS::ApiGateway::Stage
 + Add                                             ServerlessRestApi                                 AWS::ApiGateway::RestApi
 * Modify                                          HelloWorldFunctionRole                            AWS::IAM::Role
 * Modify                                          HelloWorldFunction                                AWS::Lambda::Function
 ---------------------------------------------------------------------------------------------------------------------------------------------------

 2019-11-21 14:33:24 - Waiting for stack create/update to complete

 CloudFormation events from changeset
 -------------------------------------------------------------------------------------------------------------------------------------------------
 ResourceStatus                       ResourceType                         LogicalResourceId                    ResourceStatusReason
 -------------------------------------------------------------------------------------------------------------------------------------------------
 UPDATE_IN_PROGRESS                   AWS::IAM::Role                       HelloWorldFunctionRole               -
 UPDATE_COMPLETE                      AWS::IAM::Role                       HelloWorldFunctionRole               -
 UPDATE_IN_PROGRESS                   AWS::Lambda::Function                HelloWorldFunction                   -
 UPDATE_COMPLETE                      AWS::Lambda::Function                HelloWorldFunction                   -
 CREATE_IN_PROGRESS                   AWS::ApiGateway::RestApi             ServerlessRestApi                    -
 CREATE_COMPLETE                      AWS::ApiGateway::RestApi             ServerlessRestApi                    -
 CREATE_IN_PROGRESS                   AWS::ApiGateway::RestApi             ServerlessRestApi                    Resource creation Initiated
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   Resource creation Initiated
                                                                          f9d
 CREATE_IN_PROGRESS                   AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   Resource creation Initiated
                                                                          sionProd
 CREATE_IN_PROGRESS                   AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   -
                                                                          sionProd
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   -
                                                                          f9d
CREATE_COMPLETE                      AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   -
                                                                          f9d
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           Resource creation Initiated
 CREATE_COMPLETE                      AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
 CREATE_COMPLETE                      AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   -
                                                                          sionProd
 UPDATE_COMPLETE_CLEANUP_IN_PROGRES   AWS::CloudFormation::Stack           sam-app                              -
 S
 UPDATE_COMPLETE                      AWS::CloudFormation::Stack           sam-app                              -
 -------------------------------------------------------------------------------------------------------------------------------------------------

 Stack sam-app outputs:
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 OutputKey-Description                                                     OutputValue
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 HelloWorldFunctionIamRole - Implicit IAM Role created for Hello World     arn:aws:iam::123456789012:role/sam-app-
 function                                                                  HelloWorldFunctionRole-104VTJ0TST7M0
 HelloWorldApi - API Gateway endpoint URL for Prod stage for Hello World   https://0ks2zue0zh.execute-api.us-east-1.amazonaws.com/Prod/hello/
 function
 HelloWorldFunction - Hello World Lambda Function ARN                      arn:aws:lambda:us-east-1:123456789012:function:sam-app-
                                                                          HelloWorldFunction-1TY92MJX0BXU5
 ---------------------------------------------------------------------------------------------------------------------------------------------------

 Successfully created/updated stack - sam-app in us-east-1
        

什么是Amazon SAM正在执行:

此命令将您的应用程序部署到Amazon云。它将使用您使用sam build命令,打包并将其上传到 Amazon Simple Storage Service (Amazon S3) 存储桶中,Amazon SAMCLI 使用创建和部署应用程序Amazon CloudFormation。在输出中,sam deploy命令,您可以看到正在对Amazon CloudFormation堆栈。

如果您的应用程序创建了 HTTP 终端节点,则sam deploy生成还会显示测试应用程序的终端节点 URL。您可以使用curl使用该终端节点 URL 向您的应用程序发送请求。例如:

curl https://<restapiid>.execute-api.us-east-1.amazonaws.com/Prod/hello/

成功部署应用程序后,您会看到类似以下内容的输出:

 
 {"message": "hello world"}
        

如果您看到{"message": "hello world"}在执行curl命令时,您已成功将无服务器应用程序部署到Amazon,并且你正在调用你的实时 Lambda 函数。否则,请参阅Troubleshooting部分中的内容。

第 4 步:(可选)在本地测试应用程序

在开发应用程序时,您可能会发现本地测试非常有用。这些区域有:Amazon SAMCLI 提供sam local命令使用模拟 Lambda 执行环境的 Docker 容器运行您的应用程序。有两个选项可执行此操作:

  • 在本地托管您的 API

  • 直接调用 Lambda 函数

此步骤介绍两个选项。

在本地托管您的 API

要运行的命令:

sam local start-api

输出示例:

 
 2019-07-12 15:27:58 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
 2019-07-12 15:27:58 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your Amazon SAM template
 2019-07-12 15:27:58  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

 Fetching lambci/lambda:python3.7 Docker container image......................................................................................................................................................................................
 2019-07-12 15:28:56 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
 START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST
 END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72
 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72  Duration: 4.42 ms       Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 22 MB
 2019-07-12 15:28:58 No Content-Type given. Defaulting to 'application/json'.
 2019-07-12 15:28:58 127.0.0.1 - - [12/Jul/2019 15:28:58] "GET /hello HTTP/1.1" 200 -
            

Docker 映像可能需要一段时间才能加载。加载后,您可以使用curl向本地主机上运行的应用程序发送请求:

curl http://127.0.0.1:3000/hello

输出示例:

 
 2019-07-12 15:29:57 Invoking app.lambda_handler (python3.7)
 2019-07-12 15:29:57 Found credentials in shared credentials file: ~/.aws/credentials

 Fetching lambci/lambda:python3.7 Docker container image......
 2019-07-12 15:29:58 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
 START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST
 END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72
 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72  Duration: 7.92 ms       Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 22 MB
 {"statusCode":200,"body":"{\"message\": \"hello world\"}"}
            

什么是Amazon SAM正在执行:

这些区域有:start-api命令启动复制 REST API 终端节点的本地终端节点。它下载一个可以在本地运行函数的执行容器。最终结果与您在Amazon云。

直接调用 Lambda 函数

要运行的命令:

sam local invoke "HelloWorldFunction" -e events/event.json

输出示例:

 
 2019-07-01 14:08:42 Found credentials in shared credentials file: ~/.aws/credentials
 2019-07-01 14:08:42 Invoking app.lambda_handler (python3.7)

 Fetching lambci/lambda:python3.7 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
 2019-07-01 14:09:39 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
 START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST
 END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72
 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72    Duration: 3.51 ms    Billed Duration: 100 ms    Memory Size: 128 MB    Max Memory Used: 22 MB    
 {"statusCode":200,"body":"{\"message\": \"hello world\"}"}
            

什么是Amazon SAM正在执行:

这些区域有:invoke命令直接调用您的 Lambda 函数,并且可以传递您提供的输入事件有效载荷。使用此命令,您可以将事件负载传递到文件event.json示例应用程序提供的。

您的初始化应用程序带有默认的aws-proxy事 API Gateway。系统已为您预先填充多个值。在这种情况下,HelloWorldFunction不关心特定的值,所以存根请求是可以的。您可以指定许多值来替换请求,以模拟实际请求中的期望值。以下是生成您自己的输入事件并将输出与默认event.json对象:

sam local generate-event apigateway aws-proxy --body "" --path "hello" --method GET > api-event.json diff api-event.json events/event.json

输出示例:

 
 <   "body": "",
 ---
 >   "body": "{\"message\": \"hello world\"}",
 4,6c4,6
 <   "path": "/hello",
 <   "httpMethod": "GET",
 <   "isBase64Encoded": true,
 ---
 >   "path": "/path/to/resource",
 >   "httpMethod": "POST",
 >   "isBase64Encoded": false,
 11c11
 <     "proxy": "/hello"
 ---
 >     "proxy": "/path/to/resource"
 56c56
 <     "path": "/prod/hello",
 ---
 >     "path": "/prod/path/to/resource",
 58c58
 <     "httpMethod": "GET",
 ---
 >     "httpMethod": "POST",
            

Troubleshooting

Amazon SAMCLI 错误:“安全限制不满足”

运行时sam deploy --guided,系统会提示您提出问题HelloWorldFunction may not have authorization defined, Is this okay? [y/N]。如果您响应此提示N(默认响应),您会看到以下错误:

 
Error: Security Constraints Not Satisfied
            

提示将通知您,您即将部署的应用程序可能在未经授权的情况下配置了 Amazon API Gateway API。通过响应N到此提示时,你说这是不好的。

要解决此问题,您可使用以下选项:

  • 使用授权配置您的应用程序。有关配置授权的信息,请参阅控制对 API Gateway API 的访问

  • 回答这个问题Y,表示您可以部署未经授权配置 API Gateway API 的应用程序。

Amazon SAMCLI 错误:“没有此类选项:—app-模板”

执行 sam init 时,您会看到以下错误:

 
Error: no such option: --app-template
            

这意味着您使用的是不支持 --app-template 参数的旧版本 Amazon SAM CLI。要解决此问题,您可以将 Amazon SAM CLI 版本更新为 0.33.0 或更高版本,也可以省略 sam init 命令中的 --app-template 参数。

Amazon SAMCLI 错误:“没有此类选项:—guide”

执行 sam deploy 时,您会看到以下错误:

 
Error: no such option: --guided
            

这意味着您使用的是不支持 --guided 参数的旧版本 Amazon SAM CLI。要解决此问题,您可以将 Amazon SAM CLI 版本更新为 0.33.0 或更高版本,也可以省略 sam deploy 命令中的 --guided 参数。

Amazon SAMCLI 错误:“无法创建托管资源:找不到凭证”

执行 sam deploy 时,您会看到以下错误:

 
Error: Failed to create managed resources: Unable to locate credentials
            

这意味着,您没有设置Amazon凭据以启用Amazon SAM要创建的 CLIAmazon服务调用。要解决此问题,您必须设置Amazon凭证。有关更多信息,请参阅 设置Amazon凭证

Amazon SAMCLI 错误:“正在运行AmazonSAM 项目本地需要 Docker。你有没有安装它?”

执行 sam local start-api 时,您会看到以下错误:

 
Error: Running Amazon SAM projects locally requires Docker. Have you got it installed?
            

这意味着,您没有正确安装 Docker。Docker 需要在本地测试应用程序。要解决此问题,请按照为您的开发主机安装 Docker 的说明进行操作。转到安装 Amazon SAM CLI,选择适当的平台,然后按照安装 Docker

Curl 错误:“身份验证令牌缺失”

尝试调用 API Gateway 终端节点时,您会看到以下错误:

 
 {"message":"Missing Authentication Token"}
            

这意味着您尝试向正确的域发送请求,但 URI 无法识别。要解决此问题,请验证完整 URL,并更新curl命令使用正确的 URL 执行。

卷曲错误:“卷曲:(6) 无法解决:...”

尝试调用 API Gateway 终端节点时,您会看到以下错误:

 
 curl: (6) Could not resolve: endpointdomain (Domain name not found)
            

这意味着您试图向无效域发送请求。如果您的无服务器应用程序无法成功部署,或者如果您在curl命令。验证应用程序是否成功部署通过使用Amazon CloudFormation控制台或Amazon CLI,并验证您的curl命令正确。

清除

如果您不再需要Amazon资源,则可以通过删除Amazon CloudFormation堆栈。

删除Amazon CloudFormation使用堆栈Amazon Web Services Management Console,请按照以下步骤操作:

  1. 登录到Amazon Web Services Management Console,然后打开Amazon CloudFormation控制台https://console.aws.amazon.com/cloudformation

  2. 在左侧导航窗格中,选择 Stacks (堆栈)

  3. 在堆栈列表中,选择sam-app(或您创建的堆栈的名称)。

  4. 选择 Delete

完成后,堆栈的状态会更改为删除完成

或者,您可以删除Amazon CloudFormation堆栈,通过运行以下Amazon CLI命令:

aws cloudformation delete-stack --stack-name sam-app --region region

验证已删除的堆栈

对于删除Amazon CloudFormation堆栈,您可以通过转到Amazon CloudFormation控制台。在左侧导航窗格中,依次选择堆栈,然后在搜索框旁边的下拉列表中,选择Deleted (已删除)。您应该在已删除堆栈的列表中看到堆栈的名称。

Conclusion

在本教程中,您完成了以下操作:

  1. 创建、构建并将无服务器应用程序部署到Amazon,使用Amazon SAM。

  2. 在本地使用Amazon SAMCLI 和码头。

  3. 已删除Amazon资源,您不再需要的。

后续步骤

现在,您可以使用Amazon SAMCLI。

为了帮助您入门,您可以从Amazon Serverless Application Repository示例GitHub 上的存储库。