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

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

教程:部署 Hello World 应用程序

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

此应用程序实现了基本的 API 后端。它由 Amazon API Gateway 终端节点和Amazon Lambdafunction. 向 API Gateway 终端节点发送 GET 请求时,会调用 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

先决条件

本指南假定您已完成中的操作系统的步骤。安装 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命令。

第 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.

注意

对于提示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 Storage Storage Storage 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 函数。否则,请参阅故障排除本教程后面的部分。

第 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-proxyAPI 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",
            

故障排除

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 错误:“正在运行Amazon本地 SAM 项目需要 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.

卷曲错误:“缺少身份验证令牌”

尝试调用 API Gateway 终端节点时,会显示以下错误:

 
 {"message":"Missing Authentication Token"}
            

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

卷曲错误:“curl:(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

完成后,堆栈的状态更改为DELETE_完成.

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

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

验证已删除的堆栈

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

结论

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

  1. 创建、构建和部署了无服务器应用程序Amazon使用Amazon SAM.

  2. 使用在本地测试应用程序Amazon SAMCLI 和 Docker。

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

后续步骤

现在,您可以使用Amazon SAMCLI。

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