CloudFormationカスタムリソースを使って、Data APIを有効化したAurora Serverless DBの初期化を実行する
以下のページで、Aurora ServerlessのData APIを有効化し、同APIを使用してAurora Serverに接続する方法をご紹介しました。
上記ページでは、EC2インスタンスからAWS CLIを使って、手動でDBの初期化処理(テーブル作成、テストレコード追加)を実施しました。
今回はCloudFormationカスタムリソースを使用して、初期化処理を自動化することを目的とします。
構築する環境
基本的には、冒頭でご紹介したページと同様です。
ただし以下の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)
インライン表記でコードを定義します。
詳細については、以下のページをご確認ください。
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カスタムリソースの作成状況を確認します。
正常にカスタムリソースおよびLambda関数が作成されていることがわかります。
動作確認
まずCloudFormationカスタムリソース用Lambda関数の動作状況を確認します。
具体的には、関数のCloudWatch Logsロググループを確認します。
2つのSQL文が正常に実行されたことがわかります。
そしてCloudFormationカスタムリソースとして、関数が「SUCCESS」を返していることもわかります。
つまり関数はカスタムリソースとして正常に動作したということです。
準備が整いましたので、もう1つのLambda関数を実行します。
この関数はAurora Serverlessからデータを取得するSQL文を実行します。
関数の実行はFunction URLにアクセスする形を取ります。
正常に実行されました。
カスタムリソース用関数によって追加されたレコードが表示されました。
このことからも、カスタムリソースが正常に作成され、関数が正常に実行されたということがわかります。
まとめ
CloudFormationカスタムリソースを使用して、Aurora Serverless DBの初期化処理を自動化する方法を確認しました。