🟩

AWS Application ComposerでAPI Gateway + Lambda + DynamoDBの基本セットを作ってみた

2022/12/06に公開

AWS Application ComposerでAPI Gateway + Lambda + DynamoDBの基本セットを作ってみました。

AWS Application Composerとは

ポチポチ系サーバレスアーキテクチャ構築用テンプレート作成ツール
https://docs.aws.amazon.com/application-composer/latest/dg/what-is-composer.html

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系サービスにも対応してくれるといいなと思います。

チュートリアル
https://aws.amazon.com/jp/blogs/news/visualize-and-create-your-serverless-workloads-with-aws-application-composer/

GitHubで編集を提案
NCDCエンジニアブログ

Discussion