关于 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日:第一次修订



