LoginSignup
0
0

More than 1 year has passed since last update.

DockerだけでAWS SAMをLocalStackにデプロイしてみた

Last updated at Posted at 2021-10-25

はじめに

AWS SAMを試すため、LocalStackへデプロイしようとしたら、通常のsamコマンドでは、おそらくデプロイ先のエンドポイントURLを変更できないため、LocalStackへデプロイできませんでした。
そこで、LocalStackが提供するsamlocalコマンドを使用するとデプロイできました。

また、ローカル環境をあまり汚したくなかったため、Docker (+ Docker Compose) のみで試しております。

この記事は以上のことについて、備忘録としてまとめたものです。

前提条件

DockerとDocker Composeがインストールされていること。

やってみた

LocalStackを起動させておく

$ git clone https://github.com/localstack/localstack.git
Cloning into 'localstack'...
remote: Enumerating objects: 23149, done.
remote: Counting objects: 100% (1772/1772), done.
remote: Compressing objects: 100% (619/619), done.
remote: Total 23149 (delta 1241), reused 1611 (delta 1134), pack-reused 21377
Receiving objects: 100% (23149/23149), 9.99 MiB | 16.35 MiB/s, done.
Resolving deltas: 100% (16797/16797), done.

$ cd localstack

$ docker-compose up -d
Pulling localstack (localstack/localstack:)...
latest: Pulling from localstack/localstack
c91cc7261d92: Pull complete
Digest: sha256:74323cb3ef6709f9732802e74c80b3b997359d25e603955b708efae61633b1df
Status: Downloaded newer image for localstack/localstack:latest
Creating localstack_main ... done

開発環境としてPythonコンテナを起動し、中に入る

# Pythonコンテナ内からLocalStackコンテナを名前解決可能にするため、「--link localstack_main:localstack」を設定している
$ docker run --rm -it --link localstack_main:localstack python:3.8 bash
Unable to find image 'python:3.8' locally
3.8: Pulling from library/python
bb7d5a84853b: Pull complete 
f02b617c6a8c: Pull complete 
d32e17419b7e: Pull complete 
c9d2d81226a4: Pull complete 
3c24ae8b6604: Pull complete 
8a4322d1621d: Pull complete 
a03ef301ddd7: Pull complete 
a4c591fc96f3: Pull complete 
799e70ce6240: Pull complete 
Digest: sha256:b39ab988ac2fa749273cf6fdeb89fb3635850824419dc612c8a21ff4c7961b8b
Status: Downloaded newer image for python:3.8

Pythonコンテナで事前設定を行う

# ホームディレクトリへ移動する (任意)
root@151ed9cb109a:/# cd

root@151ed9cb109a:~# pip install awscli aws-sam-cli aws-sam-cli-local
# ・・・(省略)
Successfully installed Flask-1.1.4 Jinja2-2.11.3 MarkupSafe-2.0.1 PyYAML-5.4.1 Werkzeug-1.0.1 arrow-1.2.1 attrs-21.2.0 aws-lambda-builders-1.8.1 aws-sam-cli-1.33.0 aws-sam-cli-local-1.1.0.1 aws-sam-translator-1.39.0 awscli-1.21.2 backports.zoneinfo-0.2.1 binaryornot-0.4.4 boto3-1.19.2 botocore-1.22.2 certifi-2021.10.8 chardet-4.0.0 chevron-0.14.0 click-7.1.2 colorama-0.4.3 cookiecutter-1.7.3 dateparser-1.1.0 docker-4.2.2 docutils-0.15.2 idna-2.10 itsdangerous-1.1.0 jinja2-time-0.2.0 jmespath-0.10.0 jsonschema-3.2.0 poyo-0.5.0 pyasn1-0.4.8 pyrsistent-0.18.0 python-dateutil-2.8.2 python-slugify-5.0.2 pytz-2021.3 pytz-deprecation-shim-0.1.0.post0 regex-2021.10.23 requests-2.25.1 rsa-4.7.2 s3transfer-0.5.0 serverlessrepo-0.1.10 six-1.16.0 text-unidecode-1.3 tomlkit-0.7.2 tzdata-2021.4 tzlocal-4.0.1 urllib3-1.26.7 watchdog-2.1.2 websocket-client-1.2.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.

# LocalStack用プロファイルを設定する
root@151ed9cb109a:~# aws configure --profile=local
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: ap-northeast-1
Default output format [None]: 

# samlocal用に設定する
root@151ed9cb109a:~# export LOCALSTACK_HOSTNAME=localstack

# samlocal用に設定する
root@151ed9cb109a:~# export EDGE_PORT=4566

SAMサンプルアプリケーションを作成する

root@151ed9cb109a:~# sam init --runtime python3.8

        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
What package type would you like to use?
        1 - Zip (artifact is a zip uploaded to S3)
        2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 1

Project name [sam-app]:  

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

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
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .

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

SAMサンプルアプリケーションをLocalStackへデプロイする

root@151ed9cb109a:~# cd sam-app

root@151ed9cb109a:~/sam-app# SAM_S3_BUCKET_NAME=sam-bucket

# SAMのソースコードアップロード用S3バケットを作成する
root@151ed9cb109a:~/sam-app# aws s3 mb s3://${SAM_S3_BUCKET_NAME} \
  --endpoint-url http://${LOCALSTACK_HOSTNAME}:${EDGE_PORT} \
  --profile local
make_bucket: sam-bucket

root@151ed9cb109a:~/sam-app# samlocal deploy \
  --stack-name sam-stack \
  --s3-bucket ${SAM_S3_BUCKET_NAME} \
  --profile local
Uploading to c6ce8fa8b5a97dd022ecd006536eb5a4  847 / 847  (100.00%)

        Deploying with following values
        ===============================
        Stack name                   : sam-stack
        Region                       : ap-northeast-1
        Confirm changeset            : False
        Deployment s3 bucket         : sam-bucket
        Capabilities                 : null
        Parameter overrides          : {}
        Signing Profiles             : {}

Initiating deployment
=====================
Uploading to d3c4a0926d7588147cfdc9906b4e375a.template  1068 / 1068  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
-------------------------------------------------------------------------------------------------------------
Operation                   LogicalResourceId           ResourceType                Replacement               
-------------------------------------------------------------------------------------------------------------
+ Add                       HelloWorldFunction          AWS::Lambda::Function       False                     
+ Add                       HelloWorldFunctionRole      AWS::IAM::Role              False                     
+ Add                       HelloWorldFunctionHelloWo   AWS::Lambda::Permission     False                     
                            rldPermissionProd                                                                 
+ Add                       ServerlessRestApi           AWS::ApiGateway::RestApi    False                     
+ Add                       ServerlessRestApiDeployme   AWS::ApiGateway::Deployme   False                     
                            nt510f4c1a20                nt                                                    
+ Add                       ServerlessRestApiProdStag   AWS::ApiGateway::Stage      False                     
                            e                                                                                 
-------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:000000000000:changeSet/samcli-deploy1635154640/fa450628


2021-10-25 09:37:20 - Waiting for stack create/update to complete

CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------
ResourceStatus              ResourceType                LogicalResourceId           ResourceStatusReason      
-------------------------------------------------------------------------------------------------------------
CREATE_COMPLETE             AWS::CloudFormation::Stac   HelloWorldFunctionRole      -                         
                            k                                                                                 
CREATE_COMPLETE             AWS::CloudFormation::Stac   ServerlessRestApiProdStag   -                         
                            k                           e                                                     
CREATE_COMPLETE             AWS::CloudFormation::Stac   ServerlessRestApiDeployme   -                         
                            k                           nt510f4c1a20                                          
CREATE_COMPLETE             AWS::CloudFormation::Stac   ServerlessRestApi           -                         
                            k                                                                                 
CREATE_COMPLETE             AWS::CloudFormation::Stac   sam-stack                   -                         
                            k                                                                                 
CREATE_COMPLETE             AWS::CloudFormation::Stac   HelloWorldFunctionHelloWo   -                         
                            k                           rldPermissionProd                                     
CREATE_COMPLETE             AWS::CloudFormation::Stac   HelloWorldFunction          -                         
                            k                                                                                 
-------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------
Outputs                                                                                                      
--------------------------------------------------------------------------------------------------------------
Key                 HelloWorldApi                                                                            
Description         API Gateway endpoint URL for Prod stage for Hello World function                         
Value               https://x3ovhxtd7l.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/                  

Key                 HelloWorldFunction                                                                       
Description         Hello World Lambda Function ARN                                                          
Value               arn:aws:lambda:ap-northeast-1:000000000000:function:sam-stack-HelloWorldFunction-        
fd0867a1                                                                                                     

Key                 HelloWorldFunctionIamRole                                                                
Description         Implicit IAM Role created for Hello World function                                       
Value               arn:aws:iam::000000000000:role/sam-stack-HelloWorldFunctionRole-4bd323a3                 
--------------------------------------------------------------------------------------------------------------

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

実行確認として、LocalStackにデプロイされたAPI Gatewayへリクエストする

# デプロイされたREST API IDを取得する
root@151ed9cb109a:~/sam-app# REST_API_ID=$(
  aws apigateway get-rest-apis \
    --query items[0].id \
    --output text \
    --endpoint-url http://${LOCALSTACK_HOSTNAME}:${EDGE_PORT} \
    --profile local
)

root@151ed9cb109a:~/sam-app# curl http://${LOCALSTACK_HOSTNAME}:${EDGE_PORT}/restapis/${REST_API_ID}/Prod/_user_request_/hello
{"message": "hello world"}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0