要件
pathパラメータをキーにDynamoDBに格納されているURLへリダイレクトさせる。
アーキテクチャ
2018/11/05にAPIGatewayでWAFを有効化できるようになりました(ワーイ)
APIGateway設定
新規作成
※ちょうど先日(2018/12/18)APIGatewayで WebSocketAPI の構築が出来るようになったのですが、そこには今回触れません
パスパラメータの設定
メソッドの設定(GET)
※ Lambda プロキシ統合 はAPIGatewayに対するリクエストの情報をよしなにまとめてLambdaに渡してくれるの非常に便利です!!!
メソッド作成後
Lambda
import json
import boto3
from boto3.dynamodb.conditions import Key, Attr
DYNAMO_TABLE_NAME = 'hoge-dynamodb'
def hoge(event, context):
path_id = event['pathParameters']['Id']
# DBConnection
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(DYNAMO_TABLE_NAME)
partition_key = {"Id": path_id}
res = table.get_item(Key=partition_key)
item = res["Item"]
result = {
"statusCode": 302,
"headers": {
"Location": item['url']
},
"body": ''
}
return result
※ Lambda プロキシ統合 を設定した場合はlambdaからのレスポンス形式に注意が必要です
DynamoDB
新規テーブル作成
項目の追加
Serverless設定
service: redirect
frameworkVersion: ">=1.1.0 <2.0.0"
custom:
pythonRequirements:
dockerizePip: true
provider:
name: aws
runtime: python3.6
stage: dev
region: ap-northeast-1
profile: hoge-profile
environment:
STAGE: ${self:provider.stage}
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:*
Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/*"
functions:
redirect:
handler: handler.hoge
events:
- http:
method: get
path: /{Id}
integration: lambda-proxy
resources:
Resources:
RedirectDynamoDbTable:
Type: AWS::DynamoDB::Table
DeletionPolicy: Retain
Properties:
TableName: hoge-dynamodb
AttributeDefinitions:
-
AttributeName: Id
AttributeType: S
KeySchema:
-
AttributeName: Id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
デプロイ
$ sls deploy -v
確認
APIGateWayにデプロイされたエンドポイントにpathパラメータをDynamoDBに挿入した hogepath
を付与してアクセスします。
https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/hogepath
無事にリダイレクトされたら成功です
実行環境
macOS Mojave 10.14
serverless 1.35.1
npm 6.5.0
ハマったポイント
ServerlessでDynamoDBのキャパシティユニットを設定しなくてもデフォルト値が入るだろうと記載しないでデプロイしたらCloudFormationのエラーにハマって一日潰しました・・・