{Aurora}Amazon Aurora MySQL DB クラスターからの Lambda 関数の呼び出し

(1) Lambda関数作成

-- 1. IAMロール作成
vim role01.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json


-- 2. ポリシーをロールにアタッチ
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole \
--role-name role01

-- 3. Lambda関数作成

vim test.py

#!/usr/bin/python
def lambda_handler(event, context):
print(event)
return 'OK'


chmod 755 test.py
zip -r test.zip test.py

aws lambda create-function \
--region ap-northeast-1 \
--function-name test \
--zip-file fileb://test.zip \
--role arn:aws:iam::999999999999:role/role01 \
--handler test.lambda_handler \
--runtime python3.8 \
--timeout 60 \
--vpc-config SubnetIds="subnet-11111111111111111,subnet-22222222222222222,subnet-33333333333333333",SecurityGroupIds="sg-44444444444444444"

※以下のようなエラーが出た場合は、しばらく待ってから再実行する
An error occurred (InvalidParameterValueException) when calling the CreateFunction operation:
The provided execution role does not have permissions to call CreateNetworkInterface on EC2

aws lambda list-functions
aws lambda list-functions | jq -c '.Functions | [ .FunctionName ]'

aws lambda get-function --function-name test

"State"がactiveになるまで待つ


-- 4. Lambda関数の実行テスト

aws lambda invoke \
--function-name test \
--region ap-northeast-1 \
--payload '{ "key1": "val1" }' \
output.txt

(2) DB作成


-- 5. IAMポリシー作成
vim policy02.json

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAuroraToExampleFunction",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:999999999999:function:test"
}
]
}

aws iam create-policy \
--policy-name policy02 \
--policy-document file://policy02.json

-- 6. IAMロール作成
vim role02.json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rds.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

aws iam create-role \
--role-name role02 \
--assume-role-policy-document file://role02.json


-- 7. ポリシーをロールにアタッチ
aws iam attach-role-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy02 \
--role-name role02

-- 8. クラスタパラメータグループ作成
aws rds create-db-cluster-parameter-group \
--db-parameter-group-family aurora-mysql5.7 \
--db-cluster-parameter-group-name cpg01 \
--description cpg01

vim a.json
[
{
"ParameterName": "aws_default_lambda_role",
"ParameterValue": "arn:aws:iam::999999999999:role/role02",
"ApplyMethod": "immediate"
}
]

aws rds modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name cpg01 \
--parameters file://a.json

-- 9. クラスタの作成

aws rds create-db-cluster \
--db-cluster-identifier cluster11 \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.10.0 \
--master-username root \
--master-user-password 'password' \
--db-cluster-parameter-group-name cpg01

aws rds create-db-instance \
--db-instance-identifier cluster11-instance01 \
--db-cluster-identifier cluster11 \
--db-instance-class db.t3.small \
--engine aurora-mysql \
--no-auto-minor-version-upgrade


-- 10. IAMロールをクラスタに関連付ける

aws rds add-role-to-db-cluster \
--db-cluster-identifier cluster11 \
--role-arn arn:aws:iam::999999999999:role/role02


(3) ネイティブ関数を使用した Lambda 関数の呼び出し

-- 11. テスト用ユーザとデータの作成
create user 'user1'@'%' identified by 'password';

GRANT INVOKE LAMBDA ON *.* TO 'user1'@'%';

SHOW GRANTS FOR 'user1'@'%';

※DB クラスターのマスターユーザー名にはデフォルトで INVOKE LAMBDA 権限が付与されている


SELECT lambda_sync( 'arn:aws:lambda:ap-northeast-1:999999999999:function:test', '{"key1": "val1"}');

SELECT lambda_async( 'arn:aws:lambda:ap-northeast-1:999999999999:function:test', '{"key2": "val2"}');


ERROR 63996 (HY000): Lambda API returned error: Network Connection. Unable to connect to endpoint
→ lambdaインタフェースエンドポイントを作成してエラー解消
VPC: Auroraが使用しているVPC
サブネット: Auroraが使用しているサブネット
プライベートDNS名を有効にする: YES
セキュリティグループ: Auroraが使用しているセキュリティグループ
ポリシー: フルアクセス


-- 12. クリーンアップ

-- ロールの一覧
aws iam list-roles | grep role01
aws iam list-roles | grep role02

-- ロールの削除

aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole


aws iam detach-role-policy \
--role-name role02 \
--policy-arn arn:aws:iam::999999999999:policy/policy02

aws iam delete-role --role-name role01
aws iam delete-role --role-name role02

-- ポリシーの一覧
aws iam list-policies | grep policy02

-- ポリシーの削除
aws iam delete-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy02


-- lambda関数の一覧
aws lambda list-functions | jq -c '.Functions | [ .FunctionName ]'

-- lambda関数の削除
aws lambda delete-function --function-name test

 

-- クラスタ削除
aws rds delete-db-instance \
--db-instance-identifier cluster11-instance01 \
--skip-final-snapshot

aws rds delete-db-cluster \
--db-cluster-identifier cluster11 \
--skip-final-snapshot

-- クラスタパラメータグループ削除
aws rds delete-db-cluster-parameter-group --db-cluster-parameter-group-name cpg01

-- lambdaインタフェースエンドポイントの削除