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

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

教程: 部署HelloWorld应用程序

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

此应用程序实施简单的API后端。它包括一个 API 网关 终点和 Lambda 功能。当您将GET请求发送至 API 网关 终点, Lambda 函数被调用。此功能返回 hello world 消息。

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


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

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

#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. 已配置 IAM 权限。

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

  4. 已安装 Homebrew。注意:Homebrew只是Linux和 macOS.

  5. 已安装 AWS SAM CLI。注意:请确保您有1.0.0或更高版本。您可以通过执行命令 sam --version 来检查您具有的版本。

第1步: 下载样本 AWS SAM 申请

要运行的命令:

sam init

按照屏幕上的提示操作。在本教程中,我们建议您选择AWS快速入门模板、您选择的运行时间和HelloWorld示例。

输出示例:

   
 -----------------------
 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 正在执行的操作:

此命令使用您提供的项目名称创建目录。项目目录的内容类似于以下内容(这些内容是在选择Python运行时和HelloWorld示例之一时创建的):

 
 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
        

有三个特别重要的文件:

  • 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 正在执行的操作:

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

您可以在 .aws-sam:

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

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

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

要运行的命令:

sam deploy --guided

按照屏幕上的提示操作。您只需通过 Enter 进行响应,即可接受交互式体验中提供的默认选项。

注意

提示 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 S3 桶创建人 AWS SAM CLI,并使用 AWS CloudFormation. 在部署命令的输出中,您可以看到正在对 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步: 在本地测试您的应用程序(可选)

在开发应用程序时,您可能还发现在本地测试很有用。的 AWS SAM CLI提供 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 正在执行的操作:

start-api 命令启动复制RESTAPI端点的本地端点。它下载执行容器,您可以在中本地运行您的功能。最终结果是您在AWSCloud中调用功能时看到的相同输出。

进行一次性调用

要运行的命令:

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

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

执行时 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”的这个问题作出回应,表明您正在部署具有 API 网关 未经授权配置API。

SAMCLI错误:“没有此类选项:--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 参数。

SAM CLI 错误:“没有此类选项:--guided”

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

 
Error: no such option: --guided
            

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

SAMCLI错误: “创建托管资源失败: 无法找到凭证"

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

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

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

SAMCLI错误: "在本地运行AWSSAM项目需要Docker。是否已安装好?”

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

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

这意味着您未正确安装Docker。需要Docker来测试本地应用程序。要修复此问题,请遵循为您的开发主机安装Docker的说明。

有关在开发主机上安装Docker的说明,请访问 安装 AWS SAM CLI,选择适当的平台,并按照标题为 安装Docker.

Curl错误: "缺少身份验证令牌"

在尝试调用 API 网关 端点,您将看到以下错误:

 
 {"message":"Missing Authentication Token"}
            

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

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

在尝试调用 API 网关 端点,您将看到以下错误:

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

这意味着您已尝试向无效的域发送请求。如果您的无服务器应用程序部署失败,或者您的 curl 命令。使用验证应用程序是否已成功部署 AWS CloudFormation 控制台或 AWS CLI以及您的 curl 命令正确。

清除

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

要使用 AWS 管理控制台删除使用本教程创建的 AWS CloudFormation 堆栈,请执行以下步骤:

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

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

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

  4. 选择 Delete (删除)

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

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

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

验证已删除的堆栈

对于删除 AWS CloudFormation 堆栈的两种方法,您可以通过转到 https://console.amazonaws.cn/cloudformation,在左侧导航窗格中选择 Stacks (堆栈),然后在搜索文本框右侧的下拉列表中选择 Deleted (已删除) 来验证堆栈已删除。您应该在已删除堆栈的列表中看到您的堆栈名称 sam-app(或您创建的堆栈的名称)。

Conclusion

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

  1. 通过为AWS创建、构建和部署无服务器应用程序 AWS SAM.

  2. 通过使用 AWS SAM CLI和Docker。

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

后续步骤

现在,您可以使用 AWS SAM CLI。

为帮助您入门,您可以从 AWS SAM GitHub 存储库。要访问此存储库,请参阅 AWS SAM 示例应用程序.