CFNカスタムリソースでData APIを有効化したAurora ServerlessのDBを初期化する

CloudFormationカスタムリソースでData APIを有効化したAurora ServerlessのDBを初期化する

CloudFormationカスタムリソースを使って、Data APIを有効化したAurora Serverless DBの初期化を実行する

以下のページで、Aurora ServerlessのData APIを有効化し、同APIを使用してAurora Serverに接続する方法をご紹介しました。

あわせて読みたい
Aurora ServerlessのData APIを有効化してEC2/Lambdaから接続する 【Aurora ServerlessのData APIを有効化してEC2(AWS CLI)とLambda(Boto3)から接続する】 以下のページで、Aurora Serverlessの基本的な事項について取り上げました。 ht...

上記ページでは、EC2インスタンスからAWS CLIを使って、手動でDBの初期化処理(テーブル作成、テストレコード追加)を実施しました。
今回はCloudFormationカスタムリソースを使用して、初期化処理を自動化することを目的とします。

構築する環境

Diagram of initialize DB on Aurora Serverless with Data API enabled using CloudFormation Custom Resource.

基本的には、冒頭でご紹介したページと同様です。

ただし以下の2点が異なります。

1点目はCloudFormationカスタムリソースおよびLambda関数です。
関数をカスタムリソースに関連付けて、スタック作成時に実行されるように設定します。
この関数の働きは、Aurora Serverless DBを初期化することです。
関数のランタイム環境はPython3.8です。

2点目はEC2インスタンスを配置しません。
先述の通り、Lambda関数でDBを初期化するため、インスタンスは不要です。
インスタンスが不要となりますので、インスタンスが使用していたVPCエンドポイント(SSM用、RDS Data用)も作成しません。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/060

テンプレートファイルのポイント解説

CloudFormationカスタムリソース

まずカスタムリソース用Lambda関数を確認します。

Resources:
  Function2:
    Type: AWS::Lambda::Function
    Properties:
      Environment:
        Variables:
          DBCLUSTER_ARN: !Ref DBClusterArn
          DBNAME: !Ref DBName
          DBTABLE: !Ref DBTableName
          REGION: !Ref AWS::Region
          SECRET_ARN: !Ref SecretArn
      Code:
        ZipFile: |
          import boto3
          import cfnresponse
          import json
          import os

          dbcluster_arn = os.environ['DBCLUSTER_ARN']
          dbname = os.environ['DBNAME']
          dbtable = os.environ['DBTABLE']
          region = os.environ['REGION']
          secret_arn = os.environ['SECRET_ARN']

          sql1 = 'create table {table}(id varchar(200), type varchar(200), price float)'.format(table=dbtable)
          sql2 = 'insert into {table} values (111, "dog", 123)'.format(table=dbtable)
          client = boto3.client('rds-data', region_name=region)
          schema = 'mysql'

          CREATE = 'Create'
          response_data = {}

          def lambda_handler(event, context):
            try:
              if event['RequestType'] == CREATE:
                response1 = client.execute_statement(
                  database=dbname,
                  resourceArn=dbcluster_arn,
                  schema=schema,
                  secretArn=secret_arn,
                  sql=sql1
                )
                print(response1)

                response2 = client.execute_statement(
                  database=dbname,
                  resourceArn=dbcluster_arn,
                  schema=schema,
                  secretArn=secret_arn,
                  sql=sql2
                )
                print(response2)

              cfnresponse.send(event, context, cfnresponse.SUCCESS, response_data)

            except Exception as e:
              print(e)
              cfnresponse.send(event, context, cfnresponse.FAILED, response_data)
      FunctionName: !Sub "${Prefix}-function2"
      Handler: !Ref Handler
      Runtime: !Ref Runtime
      Role: !GetAtt FunctionRole.Arn
Code language: YAML (yaml)

インライン表記でコードを定義します。
詳細については、以下のページをご確認ください。

あわせて読みたい
CloudFormationでLambdaを作成する3パータン(S3/インライン/コンテナ) 【CloudFormationでLambdaを作成する】 CloudFormationでLambdaを作成する場合、大別すると以下の3パターンあります。 S3バケットにコードをアップロードする インライ...

cfnresponseモジュールを使用して、関数をLambda-backedカスタムリソースとして実装します。
詳細につきましては、以下のページをご確認ください。

あわせて読みたい
CloudFormationカスタムリソース入門 【CloudFormationカスタムリソースの挙動を確認する構成】 CloudFormationの機能の1つにカスタムリソースがあります。 カスタムリソースを使用すると、テンプレートにカ...

コードの内容ですが、Boto3でData API用クライアントオブジェクトを作成します。
クライアントオブジェクトを通じて、以下の2つのSQL文を実行することによって、Aurora Serverless DBの初期化処理を行います。
1つ目はテーブルを作成するSQL文です。
2つ目はテストレコードを追加する文です。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • Lambda関数1:fa-060-function1
  • Lambda関数1のFunction URL:https://xv2pdk3gw3nncmvbb45pvabhji0gzlug.lambda-url.ap-northeast-1.on.aws/
  • Lambda関数2:fa-060-function2

AWS Management ConsoleからもCloudFormationカスタムリソースの作成状況を確認します。

Detail of CloudFormation Stack 1.
Detail of CloudFormation Stack 2.

正常にカスタムリソースおよびLambda関数が作成されていることがわかります。

動作確認

まずCloudFormationカスタムリソース用Lambda関数の動作状況を確認します。
具体的には、関数のCloudWatch Logsロググループを確認します。

CloudWatch Logs of Lambda Function for CloudFormation Custom Resource.

2つのSQL文が正常に実行されたことがわかります。

そしてCloudFormationカスタムリソースとして、関数が「SUCCESS」を返していることもわかります。
つまり関数はカスタムリソースとして正常に動作したということです。

準備が整いましたので、もう1つのLambda関数を実行します。
この関数はAurora Serverlessからデータを取得するSQL文を実行します。
関数の実行はFunction URLにアクセスする形を取ります。

Invocation of Lambda Function 1.

正常に実行されました。
カスタムリソース用関数によって追加されたレコードが表示されました。
このことからも、カスタムリソースが正常に作成され、関数が正常に実行されたということがわかります。

まとめ

CloudFormationカスタムリソースを使用して、Aurora Serverless DBの初期化処理を自動化する方法を確認しました。