LoginSignup
0
0

More than 1 year has passed since last update.

localstackでAWS SAM開発環境

Last updated at Posted at 2022-06-19

目的

ローカル開発に飽きてきたのでAWSを始めようと思ったが、1週間前にやった作業をほとんど忘れてしまっていたので、備忘録がわりに雑に投稿。

前提

基本的なツールはインストール済みとする。

  • Docker
  • awscli, aws-sam-cli
    などなど・・・

チュートリアル

公式のチュートリアルでHelloWorldの動作を確認しておく

ローカルでの動作確認はsam local invokeで良さそう

localstack設定

localstack用のプロファイルを設定しておく、IDやtokenはdummyでOK

$ aws configure --profile localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: us-east-1
Default output format [None]: json

こちらも公式(?)からクローンしてきてdocker-compose upでローカル環境にlocalstackを立ち上げる

なんかエラーがでたので、docker-compose.ymlの下記の一行だけコメントアウトした。
#- "${TMPDIR:-/tmp}/localstack:/tmp/localstack"

localstack上にS3のbucket作成

bucket名をsample-bucketとする場合、以下のコマンドでbucketを作成できる

aws s3 mb s3://sample-bucket --endpoint-url=http://localhost:4566

作成したbucketの確認

aws s3 ls --endpoint-url=http://localhost:4566

bucket内ファイル一覧取得

aws s3 ls s3://sample-bucket --endpoint-url=http://localhost:4566

bucketにファイルアップロード

aws s3 cp [file_path] s3://sample-bucket/ --acl public-read --endpoint-url=http://localhost:4566

bucket内ファイルの中身を確認するにはブラウザでアクセスすればよし。
例えばsample-bucket内にtest.pngを置いているなら、

http://localhost:4566/sample-bucket/test.png

sam local invokeで動作確認

先のチュートリアルで取得しているHelloWorldのapp.pyを以下のように編集。
やっていることはlocalstackにアクセスしてbucket名を取得して返しているだけ。

app.py
import json
import boto3
import os

s3 = boto3.client('s3', endpoint_url='http://host.docker.internal:4566')

def lambda_handler(event, context):

    bucket = 'sample-bucket'
    response = s3.list_objects(Bucket=bucket)


    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": response["Name"],
        }),
    }

sam local invokeで作成したbucket名が出力されれば成功

{"statusCode": 200, "body": "{\"message\": \"sample-bucket\"}"}%   

テストする時にはsam buildでビルドし直さないといけないみたい。
煩わしいが、AWS上で開発するよりも回転早いよね、、、

localstack起動時にbucket作成

こちらの記事を参照。

デフォルトでは/docker-entrypoint-initaws.dに実行したいスクリプトファイルを置く。環境変数INIT_SCRIPTS_PATHを設定しておけば、設定したフォルダ内の.shファイルを実行することも可能。
今回はdocker-compose.ymlのenvironmentおよびvolumesに以下を記載。
これでdocker-compose.ymlと同じ階層にあるentrypointフォルダ内の.shを自動実行できる。

    environment:
      ~中略~
      - INIT_SCRIPTS_PATH=/entrypoint
    volumes:
      ~中略~
      - './entrypoint:/entrypoint'
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