65.9K
CodeProject 正在变化。 阅读更多。
Home

关于 AWS CLI 和 SAM CLI 及杂项的说明

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2020年5月9日

CPOL

9分钟阅读

viewsIcon

9321

downloadIcon

57

关于 AWS CLI 和 SAM CLI 的讨论。

背景

您当然可以使用Web控制台来处理 AWS 服务。但您会发现使用AWS CLI以及SAM CLICDKCloudformation来发出命令管理 AWS 服务并部署您的无服务器应用程序会更加方便。如果您是开发人员,您会发现使用SAM CLI在本地运行/调试您的API GatewayLambda 函数非常有帮助。

环境

在本笔记中,我们需要一个 AWS 账户。获得一个AWS 免费套餐账户并不困难。我们需要确保不超出账户限制,这样就不会产生费用。除了 AWS 账户,我们还需要安装以下软件包。其中一些软件包是可选的,但当您需要它们时,它们会非常有帮助。

  1. AWS 账户
  2. Node/NPM
  3. DOTNET CORE
  4. VSC
  5. GIT
  6. Docker
  7. AWS CLI V2
  8. SAM CLI
  9. AWS CDK
  10. NGROK
    • https://ngrok.com/
    • 您只需下载并解压即可。然后您可以将可执行文件添加到PATH环境变量。
    • 当您开发一个托管在本地计算机上的 Web 应用程序时,NGROK 可以帮助您创建一个公共 Web 地址。然后人们就可以从互联网访问您的本地网站了。
  11. 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_idaws_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_idaws_secret_access_keyaws_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.liS3 存储桶。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 CLIAWS SDKCDKCloudformation,而SAM旨在帮助无服务器应用程序的开发工作。如果您是开发人员,它可能会很有帮助,因为它允许您在本地计算机上运行lambdaAPI。在本笔记中,我将举例说明如何使用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日:第一次修订
© . All rights reserved.