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

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

教程:部署 Hello World 应用程序

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

此应用程序实施基本 API 后端。它包含一个 Amazon API Gateway 终端节点和一个 AWS Lambda 函数。当您向 API 网关 终端节点发送 GET 请求时,将调用 Lambda 函数。此函数返回 hello world 消息。

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


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

在初始化示例应用程序时,您可以选择 Lambda 部署程序包类型(ZipImage)。 有关程序包类型的更多信息,请参阅 Lambda 中的 部署程序包AWS Lambda Developer Guide。

以下是为创建 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

本指南假定您已完成了在 安装 AWS SAM CLI 中适用于您的操作系统的步骤,包括:

  1. 创建 AWS 账户。

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

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

  4. 安装 Homebrew。注意: Homebrew 仅是 Linux 和 macOS 的先决条件。

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

  6. 如果您选择 Image 程序包类型,请使用 Amazon Elastic Container Registry (Amazon ECR) 存储库 URI 来执行部署。

步骤 1:下载示例 AWS SAM 应用程序

要运行的命令:

sam init

按照屏幕上的提示操作。在本教程中,我们建议您选择 AWS 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
        

AWS SAM 正在执行的操作:

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

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

当您选择其中一个 Python 运行时和 Hello World Example 时,将创建这些项目目录内容。

有三个特别重要的文件:

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

  • 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
       

AWS SAM 正在执行的操作:

CLI 附带多个 AWS SAM 运行时的抽象,用于构建依赖项,并将源代码复制到暂存文件夹中,以便所有内容都准备好打包和部署。Lambda命令将构建应用程序具有的任何依赖项,并将应用程序源代码复制到 sam build 下的文件夹以压缩并上传到 .aws-sam/build。Lambda

您可以在 .aws-sam 下看到以下顶级树:

 
 .aws_sam/
   └── build/
       ├── HelloWorldFunction/
       └── template.yaml
            

HelloWorldFunction 是一个目录,其中包含您的 app.py 文件以及应用程序使用的第三方依赖项。

步骤 3:将您的应用程序部署到 AWS 云

要运行的命令:

sam deploy --guided

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

注意

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

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

输出示例:

 
    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
        

AWS SAM 正在执行的操作:

此命令将您的应用程序部署到 AWS 云。它采用您使用 sam build 命令构建的部署项目,将它们打包并上传到 Amazon Simple Storage Service CLI 创建的 Amazon S3 (AWS SAM) 存储桶,并使用 AWS CloudFormation 部署应用程序。在 sam deploy 命令的输出中,您可以看到正在对 AWS 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,则表示您已成功将无服务器应用程序部署到 AWS,并且您将调用活动 Lambda 函数。否则,请参阅本教程后面的Troubleshooting部分。

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

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

  • 在本地托管您的 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 AWS 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\"}"}
            

AWS SAM 正在执行的操作:

命令启动复制 REST API 终端节点的本地终端节点。start-api它将下载您可在本地运行您的函数的执行容器。最终结果是您在 AWS 云中调用函数时看到的相同输出。

直接调用 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\"}"}
            

AWS SAM 正在执行的操作:

命令直接调用您的 invoke 函数,并可以传递您提供的输入事件负载。Lambda使用此命令,您可以在示例应用程序提供的文件 event.json 中传递事件负载。

您的初始化应用程序带有 aws-proxy 的默认 API 网关 事件。将为您预先填充大量值。在这种情况下,HelloWorldFunction 不关心特定值,因此,清除的请求正常。您可以指定多个值来替换请求,以模拟从实际请求中预计的值。以下是生成您自己的输入事件并将输出与默认 event.json 对象进行比较的示例:

sam local generate-event apigateway aws-proxy --body "" --path "hello" --method GET > api-event.json diff api-event.json 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

AWS SAM CLI 错误:“安全约束未满足”

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

 
Error: Security Constraints Not Satisfied
            

提示符通知您,您即将部署的应用程序可能已在未经授权配置 API 网关 API。如果向此提示响应“N”(默认),您将认为这不可行。

要修复此问题,您有以下选择:

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

  • 使用“Y”响应此问题,表示您可使用“Y”来部署具有在未经授权的情况下配置的 API 网关 API 的应用程序”。

AWS SAM CLI 错误:“No such option: --app-template”

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

 
Error: no such option: --app-template
            

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

AWS SAM CLI 错误:“No such option: --guided”

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

 
Error: no such option: --guided
            

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

AWS SAM CLI 错误:“无法创建托管资源:Cannot locate credentials (找不到凭证)”

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

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

这意味着,您尚未设置 AWS 凭证以允许 AWS SAM CLI 进行 AWS 服务调用。要解决此问题,您必须设置 AWS 凭证。有关更多信息,请参阅设置AWS凭据

AWS SAM CLI 错误:“在本地运行 AWS SAM 项目需要 Docker。是否已安装它?”

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

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

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

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

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

 
 {"message":"Missing Authentication Token"}
            

这意味着您已尝试将请求发送到正确的域,但该 URI 无法识别。要修复此问题,请验证完整 URL,并使用正确的 URL 更新 curl 命令。

Curl 错误:“curl:(6) 无法解决:..."

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

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

这意味着您已尝试向无效域发送请求。如果您的无服务器应用程序部署失败,或者您的 curl 命令中存在拼写错误,则可能会发生这种情况。使用 AWS CloudFormation 控制台或 AWS CLI 确认应用程序已成功部署,并验证您的 curl 命令是否正确。

清除

如果您不再需要通过运行本教程创建的 AWS 资源,则可以通过删除您部署的 AWS CloudFormation 堆栈来删除这些资源。

要使用 AWS CloudFormation 删除 AWS 管理控制台 堆栈,请执行以下步骤:

  1. 通过以下网址登录 AWS 管理控制台并打开 AWS CloudFormation 控制台:https://console.amazonaws.cn/cloudformation

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

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

  4. 选择 Delete

完成后,堆栈的状态将变为 DELETE_COMPLETE

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

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

验证已删除的堆栈

对于两种删除 AWS CloudFormation 堆栈的方法,您都可以转到 AWS CloudFormation 控制台以验证其是否已删除。在左侧导航窗格中,选择 Stacks (堆栈),然后在搜索框旁边的下拉列表中选择 Deleted (已删除)。您应该会在已删除堆栈列表中看到堆栈的名称。

Conclusion

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

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

  2. 已使用 AWS SAM CLI 和 Docker 在本地测试您的应用程序。

  3. 删除了不再需要的 AWS 资源。

后续步骤

现在,您可以使用 AWS SAM CLI 开始构建自己的应用程序。

为了帮助您开始使用,您可以从 上的 AWS Serverless Application Repository 示例存储库下载任何示例应用程序。GitHub