利用するサービス
・DynamoDB
・IAM
・Lambda
・API Gateway
###1.DynamoDB でテーブルを作成する###
DynamoDB を開き、「テーブル」から「テーブルの作成」をクリック。
[テーブル名]に 「demo_test」 、[プライマリキー]に「test_id」と入力し、「作成」。
###2.Lambda関数を作成する###
2つの権限をもつ、IAMロールを作成しておきましょう。
AWSLambdaBasicExecutionRole:ログの書き込み権限
DynamoDBAmazonDynamoDBFullAccess:DynamoDBへのアクセス権限
「一から作成」を選択し以下のとおり入力し、「関数の作成」
・名前:demo-lambda
・ランタイム:Python 3.6
・ロール:既存のロール
・既存のロール:作成済みのIAMロールを選択
コードを以下のように編集する。
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('demo_test')
def get_person(id):
response = table.get_item(
Key={
'test_id': id
}
)
return response['Item']
def lambda_handler(event, context):
person = get_person('001')
return person
table は dynamodbで作成した table名。
Key は プライマリキー。
###3.API Gatewayを作成する###
test_id を指定したらその値が返ってくるようにします。
API Gateway を開き、[API 名] に「demo-api」などと入力し、「APIの作成」
「GET」を選択し、[統合タイプ]はLambda、[Lambda 関数]に作成したものを選択し、「保存」。
Lambda関数が実行されperson情報がレスポンスとして返却されていることが確認できます。
作成したLambda関数では、現状、Lambdaを実行時にはレスポンスとして常に test_id:001 を返すようになっています。
ということで、まずAPI Gateway側からLambdaに変数を引き渡す設定を追加します。
「統合リクエスト」をクリック。
「マッピングテンプレートの追加」をクリックし、「application/json」と追加します。
テンプレートの以下の内容を入力し、「保存」
{
"test_id" : "$input.params('test_id')"
}
Lambda も以下の通り修正する。
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('demo_test')
def get_person(id):
response = table.get_item(
Key={
'test_id': id
}
)
return response['Item']
def lambda_handler(event, context):
person = get_person(event['test_id'])
return person
APIをインターネットに公開します。
「アクション」より「APIのデプロイ」をクリック。
https://mdqzdp29vb.execute-api.ap-northeast-1.amazonaws.com/demo?test_id=001
のように、test_idを入力すると、
{"name": "yamada", "test_id": "001"}
と結果が返ってくるようになります。
test_idを指定しないとエラーになる。
なので、
test_idの指定がなかったら全を返すように、Lambdaを編集してみる。
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('demo_test')
def get_person(id):
response = table.get_item(
Key={
'test_id': id
}
)
return response['Item']
def get_persons():
response = table.scan()
return response['Items']
def lambda_handler(event, context):
return get_persons() if event['test_id'] == '' else get_person(event['test_id'])
test_idの指定がない場合は、以下のとおりに返ってくる。
[{"name": "yamada", "test_id": "001"}, {"name": "suzuki", "test_id": "003"}, {"name": "tanaka", "test_id": "002"}]