AWS Application ComposerでAPI Gateway + Lambda + DynamoDBの基本セットを作ってみた
AWS Application ComposerでAPI Gateway + Lambda + DynamoDBの基本セットを作ってみました。
AWS Application Composerとは
ポチポチ系サーバレスアーキテクチャ構築用テンプレート作成ツール
2022年12月1日からプレビュー版がリリースされました。東京リージョンでも使用できます。
やったこと
プロジェクト作成
AWS Application Composerのプロジェクト作成
- 既存のCloudFormationのテンプレートからの読み込み、もしくは新規作成のどちらかを選択します
- ローカルのtemplateファイルとAWS Application Composerのブラウザ操作の結果を同期するかを指定します
- connectedを選択すると同期対象のディレクトリを選択できます。
createを押すと、編集画面が表示されます。
ぽちぽちアーキテクチャ設計
設計といっても単純なアプリケーションですが。
API Gateway、Lambda、DynamoDBを左のリソース一覧から選択し、右の画面にドラッグ&ドロップして、API GatewayとLambda、LambdaとDynamoDBの接続設定(設定と言っても箱と箱を繋げるだけ)を行います。
編集画面
- API GatewayとLambdaの箱を繋げるだけで(あの面倒な)、APIGatewayのリソース設定が完了します
- LambdaとDynamoDBの箱を繋げるだけでCRUDの権限をもつIAMロールの作成しLambda関数へのアタッチされたり、DynamoDBのテーブル名を自動で環境変数に設定してくれます
編集画面の各リソースの箱をダブルクリックすると細かい設定ができます。
DynamoDBの設定
ローカルとの同期を設定していると、コンソールでの操作結果がローカルのテンプレートファイルに自動反映されます。
作成されたtemplate.yaml
Transform: AWS::Serverless-2016-10-31
Resources:
Api:
Type: AWS::Serverless::Api
Properties:
Name: !Sub
- ${ResourceName} From Stack ${AWS::StackName}
- ResourceName: Api
StageName: Prod
DefinitionBody:
openapi: '3.0'
info: {}
paths:
/test:
post:
x-amazon-apigateway-integration:
httpMethod: POST
type: aws_proxy
uri: !Sub arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ApplicationComposerSampleFuction.Arn}/invocations
responses: {}
EndpointConfiguration: REGIONAL
TracingEnabled: true
Items:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: id
KeyType: HASH
StreamSpecification:
StreamViewType: NEW_AND_OLD_IMAGES
ApplicationComposerSampleFuction:
Type: AWS::Serverless::Function
Properties:
Description: !Sub
- Stack ${AWS::StackName} Function ${ResourceName}
- ResourceName: ApplicationComposerSampleFuction
CodeUri: src/Function
Handler: index.handler
Runtime: nodejs16.x
MemorySize: 3008
Timeout: 30
Tracing: Active
Environment:
Variables:
TABLE_NAME: !Ref Items
TABLE_ARN: !GetAtt Items.Arn
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref Items
Events:
ApiPOSTtest:
Type: Api
Properties:
Path: /test
Method: POST
RestApiId: !Ref Api
ApplicationComposerSampleFuctionLogGroup:
Type: AWS::Logs::LogGroup
DeletionPolicy: Retain
Properties:
LogGroupName: !Sub /aws/lambda/${ApplicationComposerSampleFuction}
Arrangeボタンを押すか、再度テンプレートファイルを読み直すことで各リソースの箱の位置がいい感じに調整されます。
最終的なCanvas
Lambda関数のコード
Lambdaをドラッグ&ドロップするとローカルにLambda関数用のファイルが作成されます。
初期状態はコンソール出力するだけのほぼ空のファイルなので、Lambda関数用のコードは自分で用意する必要があります。
DynamoDB Client SDKのをインストール後、以下のように編集しました。
DynamoDB Client SDKのインストール
npm init -y
npm i @aws-sdk/client-dynamodb
DynamoDBにデータ登録するLambda関数のコードは以下のとおりです。
src/Function/index.js
const { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb");
const uuid = require('uuid')
exports.handler = async (event, context, callback) => {
const { name, department } = JSON.parse(event.body);
const client = new DynamoDBClient({
region: "ap-northeast-1",
});
const item = {
TableName: process.env.TABLE_NAME, // 環境変数からテーブル名を取得
Item: {
id: { S: uuid.v4()},
name: { S: name },
department: { S: department },
},
};
const putItemCommand = new PutItemCommand(item);
await client.send(putItemCommand)
return {
statusCode: 200,
body: JSON.stringify({
message: "record saved",
}),
}
};
AWS環境へのデプロイ
AWS SAMを使用して作成した各リソースをAWS環境にデプロイします。
ビルド・デプロイ
sam build
sam deploy --guided --profile {プロファイル名}
--guided
オプションでstack name等を対話式で設定できます。
--profile
オプションでデプロイ先のAWSアカウントを指定できます。必要に応じて使用します。
動作確認
作成されたAPIに対してPOSTリクエストを発行して動作確認します。
動作確認
curl -X POST https://inpmjhp921.execute-api.ap-northeast-1.amazonaws.com/Prod/test -d '{"name":"nakamura", "department": "engineer" }'
DynamoDBにレコードが登録されました。
まとめ
- AWS Application Composerを使うと、Serverlessなアーキテクチャを簡単に設計、構築できます
- 複雑なアーキテクチャも簡単に設計、検証することができます
- 手動でテンプレートを作成するとIAMロールの設定や環境変数の設定などが面倒だったりするが、ポチポチ操作するだけで必要なリソースが作成されるのは非常に便利です
- 今後のアップデートにより、IoTCoreやTimestream等のIoT系サービスにも対応してくれるといいなと思います。
チュートリアル
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion