【AWS】LocalStack ~ ローカルで疑似Lambda/S3/DynamoDBを作成する ~

■ はじめに

https://dk521123.hatenablog.com/entry/2019/12/14/010524

の続き。長くなったので、分割。

今回は、ローカル上にAWS Lambda 環境を作る。
また、S3, DynamoDBも扱ってみる。

目次

【1】ローカル上にAWS Lambda 環境を作る
 1)ローカル上にLambda関数作成
 2)Lambda関数をデプロイ
 3)実行
 補足:ラムダ関数削除について

【2】ローカル上のS3 環境を操作してみる
 1)ローカル上のS3 環境をawscliで操作する
 2)ローカル上のS3 環境をboto3 APIで操作する

【3】ローカル上にDynamoDB 環境を作る

【1】ローカル上にAWS Lambda 環境を作る

1)ローカル上にLambda関数作成
2)Lambda関数をデプロイ
3)実行

1)ローカル上にLambda関数作成

# デモ用の任意のディレクトリ作成
mkdir aws_lambda

# デモ用の任意のディレクトリ移動
cd aws_lambda

# デモ用Lambda関数作成
vi hello_world.py

hello_world.py

def lambda_handler(event, context):
    print(event)
    return 'Hello from Lambda'

2)Lambda関数をデプロイ

[2-1] デプロイ

# zipがない場合、インストール
sudo apt install zip

# ソースをZIPで固める
zip hello_world.zip hello_world.py

# デプロイ
aws --endpoint-url=http://localhost:4574 --region ap-northeast-1 --profile dummy-user lambda create-function --function-name=hello_world --runtime=python3.6 --role=test --handler=hello_world.lambda_handler --zip-file fileb://hello_world.zip

[2-2] 確認

関数が作成されていることを確認するために
ダッシュボードをリロードする
 ⇒ 「hello_world」 が出てくるはず

http://localhost:8080

3)実行

# 実行
aws lambda --endpoint-url=http://localhost:4574 invoke --function-name hello_world --profile dummy-user --region ap-northeast-1 --payload '{"key1" : "value1" }' result.log

# 確認
cat result.log

Hello World from Lambda

補足:ラムダ関数削除について

ラムダ関数を一旦削除したい場合などは、「delete-function」を実行

ラムダ関数削除例

aws --endpoint-url=http://localhost:4574 --region ap-northeast-1 --profile dummy-user lambda delete-function --function-name=hello_world

【2】ローカル上のS3 環境を操作してみる

1)ローカル上のS3 環境をawscliで操作する

バケット作成

# S3バケット名「local-demo-bucket」を作る
aws s3api create-bucket --bucket local-demo-bucket --endpoint-url http://localhost:4572

# Public にする
aws s3api put-bucket-acl --bucket local-demo-bucket --acl public-read --endpoint-url=http://localhost:4572

ファイルのアップロード

aws s3 cp ~/demo s3://local-demo-bucket/sample --recursive --endpoint-url http://localhost:4572

# ファイル確認
curl -v http://localhost:4572/local-demo-bucket/sample/xxxxx.txt

ファイル一覧表示

aws s3api list-objects-v2 --bucket local-demo-bucket --prefix sample --endpoint-url http://localhost:4572

ファイルのダウンロード

aws s3 cp s3://local-demo-bucket ~/local-demo-bucket --recursive --endpoint-url http://localhost:4572

2)ローカル上のS3 環境をboto3 APIで操作する

* Pythonコードでファイル一覧表示を表示する

hello_s3.py

import boto3

s3_client = boto3.client('s3', endpoint_url='http://localhost:4572')

response = s3_client.list_objects_v2(
  Bucket='local-demo-bucket',
  Prefix='sample/',
  Delimiter='/'
)

if 'Contents' in response:
  contents = response['Contents']
  for content in contents:
    if 'Key' in content:
      path = content['Key']
      print(path)
    else:
      print('No Key')
else:
  print('No Contents')

コマンド

sudo apt install python3-pip
pip3 install boto3

python3 hello_s3.py

【出力結果例】

sample/sample0-1.txt
sample/sample0-2.txt

【3】ローカル上にDynamoDB 環境を作る

pip install --upgrade awscli

テーブルを作成

# テーブル名「local-demo-table」を作成 
aws dynamodb create-table --table-name local-demo-table --attribute-definitions AttributeName=Id,AttributeType=S --key-schema AttributeName=Id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 --endpoint-url http://localhost:4569

データを登録

aws dynamodb put-item --table-name local-demo-table --item '{"Id": {"S": "test"}, "Column1": {"S": "test1"}, "Column2": {"S": "test2"}, "Column3": {"S": "test3"}}' --endpoint-url http://localhost:4569

参考文献

Lambda
http://engmng.blog.fc2.com/blog-entry-53.html
https://dev.classmethod.jp/cloud/aws/localstack-lambda/

関連記事

LocalStack ~ ローカルで疑似AWSを作成する ~
https://dk521123.hatenablog.com/entry/2019/12/14/010524
LocalStack ~ awscli-local ~
https://dk521123.hatenablog.com/entry/2020/12/16/211127
AWS Glue ~ ローカル環境を作成する ~
https://dk521123.hatenablog.com/entry/2019/11/10/205535
Amazon S3Python boto3でS3を操作する ~
https://dk521123.hatenablog.com/entry/2019/10/21/230004
boto3 API / list_objects_v2 の 使用上の注意 と その対策
https://dk521123.hatenablog.com/entry/2019/12/06/232617