dshimizu/blog/alpha

とりとめのないITブログ

AWS SAM CLIをDockerで利用してみる

AWS SAM CLIをDockerで使えるようにしてみる。

Dockerで利用する

適当な作業ディレクトリに移動してDockerfileを設置する。 Dockerfileは以下のようなものでとりあえず良いと思う。実運用する場合は他にもいくつかパッケージなどが必要になると思う。

FROM python:3

# Install awscli and aws-sam-cli
RUN apt-get update && \
    pip install awscli && \
    pip install aws-sam-cli

RUN mkdir /app
WORKDIR /app

ビルドする。

% docker build -t sam-cli .

実行テスト。

% docker run --rm -it -v ${HOME}/.aws:/root/.aws -v $(pwd):/app sam-cli sam --help
Usage: sam [OPTIONS] COMMAND [ARGS]...

  AWS Serverless Application Model (SAM) CLI

  The AWS Serverless Application Model extends AWS CloudFormation to provide
  a simplified way of defining the Amazon API Gateway APIs, AWS Lambda
  functions, and Amazon DynamoDB tables needed by your serverless
  application. You can find more in-depth guide about the SAM specification
  here: https://github.com/awslabs/serverless-application-model.

Options:
  --debug    Turn on debug logging to print debug message generated by SAM
             CLI.

  --version  Show the version and exit.
  --info
  --help     Show this message and exit.

Commands:
  init      Init an AWS SAM application.
  validate  Validate an AWS SAM template.
  build     Build your Lambda function code
  local     Run your Serverless application locally for quick development &...
  package   Package an AWS SAM application.
  deploy    Deploy an AWS SAM application.
  logs      Fetch logs for a function
  publish   Publish a packaged AWS SAM template to the AWS Serverless
            Application Repository.

bash を起動して整える。

% docker run --rm -it -v ${HOME}/.aws:/root/.aws -v $(pwd):/app sam-cli bash
root@4012c5e9eb75:/app#

PythonならHello Worldsam init & sam build & sam deploy はそのままできる。他の言語でやる場合は別途その言語の実行環境が必要になると思う。

root@4012c5e9eb75:/app# sam init

    SAM CLI now collects telemetry to better understand customer needs.

    You can OPT OUT and disable telemetry collection by setting the
    environment variable SAM_CLI_TELEMETRY=0 in your shell.
    Thanks for your help!

    Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html

Which template source would you like to use?
    1 - AWS Quick Start Templates
    2 - Custom Template Location
Choice: 1

Which runtime would you like to use?
    1 - nodejs12.x
    2 - python3.8
    3 - ruby2.7
    4 - go1.x
    5 - java11
    6 - dotnetcore3.1
    7 - nodejs10.x
    8 - python3.7
    9 - python3.6
    10 - python2.7
    11 - ruby2.5
    12 - java8
    13 - dotnetcore2.1
Runtime: 2

Project name [sam-app]:

Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git

AWS quick start application templates:
    1 - Hello World Example
    2 - EventBridge Hello World
    3 - EventBridge App from scratch (100+ Event Schemas)
    4 - Step Functions Sample App (Stock Trader)
    5 - Elastic File System Sample App
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./sam-app/README.md


root@4012c5e9eb75:/app# ls
Dockerfile  requirements.txt  sam-app

root@4012c5e9eb75:/app# ls -ltha sam-app/
total 16K
drwxr-xr-x 8 root root  256 Apr  9 10:02 .
drwxr-xr-x 6 root root  192 Apr  9 10:02 ..
-rw-r--r-- 1 root root 3.7K Apr  9 10:02 .gitignore
-rw-r--r-- 1 root root 7.4K Apr  9 10:02 README.md
drwxr-xr-x 3 root root   96 Apr  9 10:02 events
drwxr-xr-x 5 root root  160 Apr  9 10:02 hello_world
-rw-r--r-- 1 root root 1.6K Apr  9 10:02 template.yaml
drwxr-xr-x 3 root root   96 Apr  9 10:02 tests


root@6b5044c9b917:/app# cd sam-app/
root@6b5044c9b917:/app/sam-app# ls
README.md  events  hello_world  template.yaml  tests

root@6b5044c9b917:/app/sam-app# sam build
Building function 'HelloWorldFunction'
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

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


root@6b5044c9b917:/app/sam-app#  sam deploy --guided

Configuring SAM deploy
======================

    Looking for samconfig.toml :  Not found

    Setting default arguments for 'sam deploy'
    =========================================
    Stack Name [sam-app]:
    AWS Region [us-east-1]: ap-northeast-1
    #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
    Confirm changes before deploy [y/N]: y
    #SAM needs permission to be able to create roles to connect to the resources in your template
    Allow SAM CLI IAM role creation [Y/n]: y
    HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
    Save arguments to samconfig.toml [Y/n]: y
y
    Looking for resources needed for deployment: Found!

        Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-d5um5s9rfs03
        A different default S3 bucket can be set in samconfig.toml

    Saved arguments to config file
    Running 'sam deploy' for future deployments will use the parameters saved above.
    The above parameters can be changed by modifying samconfig.toml
    Learn more about samconfig.toml syntax at
    https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html

    Deploying with following values
    ===============================
    Stack name                 : sam-app
    Region                     : ap-northeast-1
    Confirm changeset          : True
    Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-d5um5s9rfs03
    Capabilities               : ["CAPABILITY_IAM"]
    Parameter overrides        : {}

Initiating deployment
=====================
Uploading to sam-app/6e73c0793f17af860e95c1f4b207a8d8  538937 / 538937.0  (100.00%)
HelloWorldFunction may not have authorization defined.
Uploading to sam-app/9f219b8c4b1684bce0abdc78ecce768a.template  1089 / 1089.0  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                                                                                                               LogicalResourceId                                                                                                       ResourceType
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                                                                                                   HelloWorldFunctionHelloWorldPermissionProd                                                                              AWS::Lambda::Permission
+ Add                                                                                                                   HelloWorldFunctionRole                                                                                                  AWS::IAM::Role
+ Add                                                                                                                   HelloWorldFunction                                                                                                      AWS::Lambda::Function
+ Add                                                                                                                   ServerlessRestApiDeployment47fc2d5f9d                                                                                   AWS::ApiGateway::Deployment
+ Add                                                                                                                   ServerlessRestApiProdStage                                                                                              AWS::ApiGateway::Stage
+ Add                                                                                                                   ServerlessRestApi                                                                                                       AWS::ApiGateway::RestApi
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:************:changeSet/samcli-deploy1596967669/32ef81c8-3340-40fa-aa04-30502b64278d


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2020-04-09 10:07:58 - Waiting for stack create/update to complete

CloudFormation events from changeset
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                                                                            ResourceType                                                                              LogicalResourceId                                                                         ResourceStatusReason
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS                                                                        AWS::IAM::Role                                                                            HelloWorldFunctionRole                                                                    -
CREATE_IN_PROGRESS                                                                        AWS::IAM::Role                                                                            HelloWorldFunctionRole                                                                    Resource creation Initiated
CREATE_COMPLETE                                                                           AWS::IAM::Role                                                                            HelloWorldFunctionRole                                                                    -
CREATE_IN_PROGRESS                                                                        AWS::Lambda::Function                                                                     HelloWorldFunction                                                                        Resource creation Initiated
CREATE_IN_PROGRESS                                                                        AWS::Lambda::Function                                                                     HelloWorldFunction                                                                        -
CREATE_COMPLETE                                                                           AWS::Lambda::Function                                                                     HelloWorldFunction                                                                        -
CREATE_IN_PROGRESS                                                                        AWS::ApiGateway::RestApi                                                                  ServerlessRestApi                                                                         -
CREATE_IN_PROGRESS                                                                        AWS::ApiGateway::RestApi                                                                  ServerlessRestApi                                                                         Resource creation Initiated
CREATE_COMPLETE                                                                           AWS::ApiGateway::RestApi                                                                  ServerlessRestApi                                                                         -
CREATE_IN_PROGRESS                                                                        AWS::Lambda::Permission                                                                   HelloWorldFunctionHelloWorldPermissionProd                                                Resource creation Initiated
CREATE_IN_PROGRESS                                                                        AWS::Lambda::Permission                                                                   HelloWorldFunctionHelloWorldPermissionProd                                                -
CREATE_IN_PROGRESS                                                                        AWS::ApiGateway::Deployment                                                               ServerlessRestApiDeployment47fc2d5f9d                                                     -
CREATE_IN_PROGRESS                                                                        AWS::ApiGateway::Deployment                                                               ServerlessRestApiDeployment47fc2d5f9d                                                     Resource creation Initiated
CREATE_COMPLETE                                                                           AWS::ApiGateway::Deployment                                                               ServerlessRestApiDeployment47fc2d5f9d                                                     -
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                                                                   HelloWorldFunctionHelloWorldPermissionProd                                                -
CREATE_COMPLETE                                                                           AWS::CloudFormation::Stack                                                                sam-app                                                                                   -
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole
Description         Implicit IAM Role created for Hello World function
Value               arn:aws:iam::************:role/sam-app-HelloWorldFunctionRole-1VG0CUFPYLY4I

Key                 HelloWorldApi
Description         API Gateway endpoint URL for Prod stage for Hello World function
Value               https://**********.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

Key                 HelloWorldFunction
Description         Hello World Lambda Function ARN
Value               arn:aws:lambda:ap-northeast-1:************:function:sam-app-HelloWorldFunction-DGMUIFS14T20
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-app in ap-northeast-1

参考