(1) Lambda関数作成
{
"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
{
"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インタフェースエンドポイントの削除