- SAM CLIとDynamo DB Localを使用してローカル環境でサーバーレスアプリを構築する手順についてメモする。
前提条件
-
Docker、docker-composeインストール済みであること。
-
dynamodb-admin(DynamoDB GUIツール)インストール済みであること。インストール手順
-
SAM CLIインストール済みであること。
-
ディレクトリ構成
local_app - dynamodb -- docker-compose.yml | |_ docker - dynamodb |_ sam-app
構築手順
DynamoDB Local準備
-
docker-compose.yml
準備version: '3.8' services: dynamodb-local: command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data" image: "amazon/dynamodb-local:latest" container_name: dynamodb-local ports: - "8000:8000" volumes: - "./docker/dynamodb:/home/dynamodblocal/data" working_dir: /home/dynamodblocal networks: - lambda-local networks: lambda-local: external: true
2.Docker network 作成+コンテナ起動
docker network create lambda-local
docker-compose up
※localhost:8000でコンテナが起動する。
3.dynamodb-admin(http://localhost:8001
)にアクセス
4.テスト用テーブルtest-table
作成
※テーブル設定は下記の通り。
{
"AttributeDefinitions": [
{
"AttributeName": "name",
"AttributeType": "S"
},
{
"AttributeName": "date",
"AttributeType": "S"
}
],
"TableName": "test-table",
"KeySchema": [
{
"AttributeName": "name",
"KeyType": "HASH"
},
{
"AttributeName": "date",
"KeyType": "RANGE"
}
],
"TableStatus": "ACTIVE",
"CreationDateTime": "2022-01-16T05:43:16.767Z",
"ProvisionedThroughput": {
"LastIncreaseDateTime": "1970-01-01T00:00:00.000Z",
"LastDecreaseDateTime": "1970-01-01T00:00:00.000Z",
"NumberOfDecreasesToday": 0,
"ReadCapacityUnits": 3,
"WriteCapacityUnits": 3
},
"TableSizeBytes": 116,
"ItemCount": 3,
"TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/test-table"
}
SAMプロジェクト準備
1.SAMプロジェクト作成
local_appディレクトリ内で次のコマンドを実行。
sam init --runtime python3.8
※HelloworldFunction利用。その他もデフォルト設定で作成。
2.各種設定、コード変更
-
app.py
DynamoDBテーブル
test-table
にname
、date
を登録する。
import json
import boto3
import string
import random
from datetime import datetime
def lambda_handler(event, context):
# DynamoDB接続設定
session = boto3.session.Session()
region = session.region_name
dynamodb = boto3.resource('dynamodb', region_name = region, endpoint_url = "http://dynamodb-local:8000")
# テーブルを取得
table = dynamodb.Table('test-table')
# name(文字数5の英数字文字列)
dat = string.digits + string.ascii_lowercase + string.ascii_uppercase
name = ''.join([random.choice(dat) for i in range(5)])
# 日時
date = datetime.utcnow().isoformat()
# 登録アイテム
item = {'name': name, 'date': date}
# テーブル登録
table.put_item(
Item=item
)
return {
"statusCode": 200,
"body": json.dumps(item),
}
-
requirements.txt
※
boto3
追加requests boto3
-
template.yml
※Pathを
/item
、Methodをpost
に変更~省略~ Events: HelloWorld: Type: Api Properties: Path: /item Method: post
3.API起動
sam local start-api --docker-network lambda-local