本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:部署 Hello World 应用程序
在本指南中,您可以使用下载、构建和部署示例 Hello World 应用程序Amazon SAM. 然后,您可以在Amazon云,可以选择在开发主机上本地测试它。
此应用程序实现了基本的 API 后端。它由 Amazon API Gateway 终端节点和Amazon Lambdafunction. 向 API Gateway 终端节点发送 GET 请求时,会调用 Lambda 函数。此函数返回hello world消息。
下图显示此应用程序的组件:
初始化示例应用程序时,您可以选择 Lambda 部署包类型,Zip要么Image. 有关包装类型的更多信息,请参阅Lambda 部署程序包中的Amazon Lambda开发人员指南.
以下是为创建 Hello World 应用程序而运行的命令的预览。有关其中每个命令的更多信息,请参阅本教程后面的各个部分。
#Step 1 - Download a sample applicationsam init#Step 2 - Build your applicationcd sam-appsam build#Step 3 - Deploy your applicationsam deploy --guided
先决条件
本指南假定您已完成中的操作系统的步骤。安装 Amazon SAM CLI,其中包括:
-
创建Amazonaccount.
-
配置Amazon Identity and Access Management(IAM) 权限。
-
安装 Docker。注意:Docker 只是在本地测试应用程序的先决条件。
-
安装 Homebrew。注意:自制软件只是 Linux 和 macOS 的先决条件。
-
安装Amazon SAM命令行界面 (CLI)。注意:请确保您具有版本 1.13.0 或更高版本。通过运行
sam --version命令。
第 1 步:下载示例Amazon SAM应用程序
要运行的命令:
sam init
按照屏幕上的提示操作。对于本教程,建议您选择Amazon
Quick Start Templates,Zip软件包类型、您选择的运行时间以及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 向应用程序发送请求。例如:
curlhttps://<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按照以下步骤操作:
-
登录到 Amazon Web Services Management Console 并打开 Amazon CloudFormation 控制台 https://console.aws.amazon.com/cloudformation
。 -
在左侧导航窗格中,选择 Stacks (堆栈)。
-
在堆栈列表中,选择sam-app(或者您创建的堆栈的名称)。
-
选择 Delete。
完成后,堆栈的状态更改为DELETE_完成.
或者,您也可以删除Amazon CloudFormation通过运行以下命令来堆叠Amazon CLI命令:
aws cloudformation delete-stack --stack-namesam-app--regionregion
验证已删除的堆栈
对于删除的两种方法Amazon CloudFormation堆栈,你可以通过转到Amazon CloudFormation控制台
结论
在本教程中,您完成了以下操作:
-
创建、构建和部署了无服务器应用程序Amazon使用Amazon SAM.
-
使用在本地测试应用程序Amazon SAMCLI 和 Docker。
-
已删除Amazon您不再需要的资源。
后续步骤
现在,您可以使用Amazon SAMCLI。
为了帮助您入门,您可以从Amazon Serverless Application Repository示例