关于 AWS CLI 和 SAM CLI 及杂项的说明
关于 AWS CLI 和 SAM CLI 的讨论。
背景
您当然可以使用Web控制台来处理 AWS 服务。但您会发现使用AWS CLI以及SAM CLI、CDK和Cloudformation来发出命令管理 AWS 服务并部署您的无服务器应用程序会更加方便。如果您是开发人员,您会发现使用SAM CLI在本地运行/调试您的API Gateway和Lambda 函数非常有帮助。
环境
在本笔记中,我们需要一个 AWS 账户。获得一个AWS 免费套餐账户并不困难。我们需要确保不超出账户限制,这样就不会产生费用。除了 AWS 账户,我们还需要安装以下软件包。其中一些软件包是可选的,但当您需要它们时,它们会非常有帮助。
- AWS 账户
- Node/NPM
- https://node.org.cn/en/
- https://codeproject.org.cn/Articles/878189/Node-js-Get-Started-and-Miscellaneous
- 您只需解压下载的文件,并将bin目录添加到
PATH
环境变量即可。
- DOTNET CORE
- https://dotnet.microsoft.com/download
- https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-ubuntu-1910
- 您可以通过“apt-cache search dotnet-sdk*”来检查 Microsoft 产品存储库是否已注册;
- dotnet core 是可选的。只有当您想使用它时才需要。
- VSC
- GIT
- Docker
- https://www.docker.com/
- https://docs.dockerd.com.cn/install/linux/docker-ce/ubuntu/#install-docker-ce-1
- https://docs.dockerd.com.cn/install/linux/linux-postinstall/
- https://codeproject.org.cn/Articles/1264033/A-Note-on-Docker
- 在某些 Linux 发行版中,您可能需要将存储库更改为 xenial 才能通过“
apt-get
”安装 Docker。
- AWS CLI V2
- https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
- https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html
- AWS CLI 版本 2 不依赖于其他软件。它包含安装程序中的所有依赖项的自包含嵌入式副本。您不再需要安装和维护 Python 即可使用 AWS CLI。
- 在 Linux 上,要升级您的 AWS CLI 版本 2 副本,请执行与安装时相同的步骤,但这次请在安装命令中使用
--update
或-u
选项。
- SAM CLI
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html
- 在 Linux 上,安装 SAM CLI 的推荐方法是 Homebrew。安装 SAM CLI 时,Homebrew 也会在/home/linuxbrew/.linuxbrew/bin/python3目录中安装一个 Python 副本。
- 在 Linux 上,如果您想升级 SAM CLI,可以发出命令“
brew upgrade aws-sam-cli
”。它将同时升级 Homebrew 和 SAM CLI。 - 在 Linux 上,要获取有关 SAM CLI 的更多信息,您可以发出命令“
brew info aws-sam-cli
”。
- AWS CDK
- NGROK
- https://ngrok.com/
- 您只需下载并解压即可。然后您可以将可执行文件添加到
PATH
环境变量。 - 当您开发一个托管在本地计算机上的 Web 应用程序时,NGROK 可以帮助您创建一个公共 Web 地址。然后人们就可以从互联网访问您的本地网站了。
- DBeaver
- https://dbeaver.io/
- DBeaver 是可选的。但如果您处理数据库,它会很有帮助,因为它是一个通用的工具;
- DBeaver 依赖于 JAVA,但自 7.3.1 版本起,所有发行版都自带 OpenJDK 11 捆绑包;
- 您可以按照说明进行安装 - https://dbeaver.io/download/。
“SAM CLI”是通过 Homebrew 安装的。如果您不熟悉 Homebrew,以下命令可能会有所帮助。
brew --version brew update brew doctor brew tap brew search ... brew list brew info <package-name> brew install <package-name> brew upgrade <package-name> brew tap beeftornado/rmtree brew rmtree <package-name> brew remove <package-name> sh -c \ "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
如果您想卸载 Homebrew,可以运行以下脚本。
ruby -e \ "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
如果由于某种原因,您无法通过 Homebrew 安装软件包,可以尝试以下命令。
sudo apt-get install build-essential patch ruby-dev zlib1g-dev liblzma-dev
AWS 权限与 S3 存储桶
为了使用 AWS & SAM CLI,您需要提供凭据来证明您是 AWS 授权用户。AWS 服务中有两种类型的用户:
- 根用户 -它是您注册 AWS 账户时使用的电子邮件地址。它拥有对该账户的所有访问权限,包括账单和付款信息。
- IAM 用户 -它是您可以授予不同权限级别的普通用户。
我们将使用普通用户通过 AWS & SAM CLI 与 AWS 进行交互。当您创建 IAM 用户时,AWS 会询问您“AWS 访问类型”。
- AWS 管理控制台访问 -用户可以通过 Web 控制台访问 AWS。
- 编程访问 -用户可以通过 AWS CLI & SAM CLI 访问 AWS。
启用编程访问后,您可以创建aws_access_key_id
和aws_secret_access_key
对。您将使用密钥对来访问 AWS 服务。为简单起见,我为练习创建了一个具有AdministratorAccess策略的用户。我的实验用户拥有对我 AWS 账户的所有访问权限,但付款信息除外。
[default] aws_access_key_id = ..PUT THE KEY ID HERE.. aws_secret_access_key = ..PUT THE SECRETE KEY HERE.. [profile-1] aws_access_key_id = ..PUT THE KEY ID HERE.. aws_secret_access_key = ..PUT THE SECRETE KEY HERE..
AWS CLI & SAM CLI 会检查~/.aws/credentials文件以获取权限。您可以在credentials文件中添加多个权限。当您发出命令时,可以使用--profile选项来选择要使用的凭据。如果未提供--profile
,则使用默认值。
“config”和“credentials”文件
您可能会注意到.aws文件夹中可能有两个文件。根据stackoverflow和文档,这两个文件具有相似且相关的功能。
- 这两个文件是分开的,以便将凭据与不太敏感的配置信息分开。
- credentials 文件仅用于存储已配置配置文件的凭据信息(当前仅限于:
aws_access_key_id
、aws_secret_access_key
和aws_session_token
)。 - config 文件用于存储已配置配置文件的非敏感配置选项。
- config 文件也可以配置为包含可以存储在 credentials 文件中的任何信息。
- 如果 config 和 credentials 文件中为某个配置文件指定了冲突的凭据信息,则 credentials 文件中的信息将优先。
简单的 AWS S3 命令
准备好权限后,我们就可以尝试 AWS 命令了。
aws s3api create-bucket --bucket example.huge.head.li --region us-east-1
上面的命令创建了一个名为example.huge.head.li
的S3 存储桶。S3 存储桶的名称是全局唯一的。如果您想自己尝试,则需要选择一个全局唯一的名称。如果您想阻止对该存储桶的公共访问,可以发出以下命令:
aws s3api put-public-access-block \ --bucket example.huge.head.li \ --public-access-block-configuration \ "BlockPublicAcls=true,IgnorePublicAcls=true, BlockPublicPolicy=true,RestrictPublicBuckets=true"
现在您可以将文件上传到您的S3 存储桶了。
aws s3 cp testfile s3://example.huge.head.li/
您可以使用以下命令删除 S3 存储桶中的所有文件和文件夹:
aws s3 rm s3://example.huge.head.li/ --recursive
如果需要,您可以删除您的 S3 存储桶。
aws s3 rb s3://example.huge.head.li --force
如果一切顺利,您应该能够成功运行 AWS 命令。您可以使用 AWS 控制台查看创建的 S3 存储桶以及上传到其中的文件。
无服务器应用程序模型 & SAM CLI
在 AWS 的术语中,AWS CLI、AWS SDK、CDK、Cloudformation,而SAM旨在帮助无服务器应用程序的开发工作。如果您是开发人员,它可能会很有帮助,因为它允许您在本地计算机上运行lambda和API。在本笔记中,我将举例说明如何使用SAM。
附带的是一个简单的 Python 无服务器应用程序。您可以使用sam init命令通过 SAM CLI 创建一个无服务器应用程序。
sam init
您可以按照说明创建无服务器应用程序。在 SAM CLI 创建的模板项目中,template.yaml文件是项目的Cloudformation 模板。
Description: > sam-python-example Sample SAM Template for sam-python-example Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ FunctionName: HelloWorldFunction Handler: app.lambda_handler Runtime: python3.8 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get
在template.yaml中,我们可以找到以下内容:
- 它定义了一个用hello_world文件夹实现的 lambda。lambda 的入口点是app.py文件中的lambda_handler函数。
- 它定义了一个 API Gateway,公开了具有/hello路径的
GET
端点。
为了使示例简单,我让 lambda 返回一个简单的 JSON 对象。
# import ptvsd
# ptvsd.enable_attach(address=('0.0.0.0', 5000), redirect_output=True)
# ptvsd.wait_for_attach()
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps({
'event-path': event.get('httpMethod', 'N/A'),
'message': 'hello world'
}),
}
调用 Lambda & 启动 API
SAM的最佳功能之一是它允许通过 Docker 容器模拟本地计算机上的 AWS 环境。要本地运行 lambda,可以发出以下命令:
sam local invoke HelloWorldFunction -e ./events/event.json
- 如果template.yaml仅声明了一个 lambda,则无需在命令中指定 lambda 的名称。
-e
选项提供一个文件。该文件包含一个 JSON 字符串,用于向函数提供输入参数event
。如果省略,event
参数将指向一个空对象。
您还可以通过以下命令在本地计算机上托管 API:
sam local start-api
运行 API 的默认端口号是 3000。然后您可以通过 URL “http://127.0.0.1:3000/hello”在浏览器中访问 API,您应该能收到以下响应:
{"event-path": "GET", "message": "hello world"}
用于在本地调用 lambda 的 Python 版本是 Docker 镜像自带的 Python。它不是您计算机上安装的 Python。
本地调试 & 断点
使用 SAM,您可以设置源代码中的断点,并在Visual Studio Code中本地调试代码。为了调试 Python lambda,我们需要在项目中添加三项内容。首先,我们需要添加ptvsd包并在app.py文件中使用它。
import ptvsd
ptvsd.enable_attach(address=('0.0.0.0', 5000), redirect_output=True)
ptvsd.wait_for_attach()
然后,我们需要在hello_world
目录中安装ptvsd。
cd hello_world/ python3 -m pip install ptvsd==4.3.2 -t .
最后,我们需要在 Visual Studio Code 的launch.json文件中添加调试配置。
{ "version": "0.2.0", "configurations": [ { "name": "SAM CLI Python Hello World", "type": "python", "request": "attach", "port": 5000, "host": "localhost", "pathMappings": [ { "localRoot": "${workspaceFolder}/hello_world", "remoteRoot": "/var/task" } ] } ] }
然后我们可以使用-d
选项调用 lambda。
sam local invoke -d 5000
使用-d
选项时,lambda 的调用将等待调试器附加。然后我们可以设置断点并开始调试。
我们也可以通过以下命令在通过 API 调用 lambda 时调试它:
sam local start-api -d 5000
如果您使用Node.js创建 lambda,调试会简单得多。您只需要在launch.json文件中创建调试配置。
{ "version": "0.2.0", "configurations": [ { "name": "Node lambda Attach", "type": "node", "request": "attach", "address": "localhost", "port": 5000, "localRoot": "${workspaceRoot}/...folder of the lambda implementation...", "remoteRoot": "/var/task", "protocol": "inspector", "stopOnEntry": false } ] }
SAM 部署
您可以使用 SAM CLI 将无服务器应用程序部署到 AWS。您可以简单地发出以下命令来启动部署:
sam deploy --guided
您需要按照说明并提供额外信息才能部署应用程序。成功后,SAM将生成一个samconfig.toml文件。
version = 0.1 [default] [default.deploy] [default.deploy.parameters] stack_name = "sam-python-example" s3_bucket = "the.s3.bucket.name.used.for.deployment" s3_prefix = "sam-python-example" region = "us-east-1" capabilities = "CAPABILITY_IAM"
该文件包含部署所需的所有信息。如果您对 lambda 进行了任何更改,只需发出sam deploy
命令,无需其他信息。
sam deploy
AWS CDK & SAM Local
与 Cloudformation 相比,AWS CDK是一个比SAM CLI功能更强大的工具。如果您想使用 AWS CDK 开发应用程序,仍然可以利用SAM CLI提供的本地调用和调试能力。通过正确创建的 CDK 资源,您可以发出以下命令来创建template.yaml文件:
cdk synth --no-staging > template.yaml
然后您可以使用 SAM CLI 命令来调用和调试 lambda。
关注点
- 这是一篇关于 AWS & SAM CLI & 其他主题的笔记。
- AWS 是一个庞大的主题,这篇笔记并没有针对任何特定主题进行很好的组织,但如果对于无服务器开发来说,它应该具有一定的参考价值。
- 希望您喜欢我的帖子,并希望这篇笔记能以某种方式帮助您。
历史
- 2020年3月30日:第一次修订