AWS

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

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

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

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

上記ページでは、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テンプレートを配置しています。

awstut-fa/060 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

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

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)

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

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

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

環境構築

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の初期化処理を自動化する方法を確認しました。

タイトルとURLをコピーしました