目的
ローカル開発に飽きてきたので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名を取得して返しているだけ。
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'