先に以下の記事を投稿しました
この記事ではamplifyで1つのenvしか用いない前提で記載しています。
本記事ではこの記事(以降元記事と記載します)を発展させて、envを複数用意した場合にenv毎に別のVPCに接続するための手順を記載します。
やること
元記事の手順をベースとして、以下の部分を変更してlambdaを作成します。
- セキュリティグループIDとサブネットグループIDをパラメータ化し、値は別ファイルに設定する
- 値の設定先としてenv毎にパラメータを指定できる
amplify/team-provider-info.json
を使用する
前提
amplify add env
により、devに加えてstgを作成済みとします。 これ以外は元記事の前提に準じます。
手順
(太字が元記事と異なる部分)
- 【事前準備】lambdaの新規作成
- lambdaのテンプレートファイル編集
- VPC接続設定に必要なIAMポリシー追加
- パラメータ定義
- パラメータを用いてVPC接続設定追加
- リソースの構築順指定
-
env毎に異なるパラメータ値を設定
- envがdevの場合のパラメータ値を追加
- envがstgの場合のパラメータ値を追加
- ビルド&クラウドへの反映
- 確認
以下に詳細な手順を記載します。
1. 【事前準備】lambdaの新規作成
元記事と同じ手順とにてvpclambda
関数を作成します。(詳細は省略)
2. lambdaのテンプレートファイル編集
1.で作成されたテンプレートファイルvpclambda-cloudformation-template.json
に対して4か所追記します。
List型パラメータを定義する場合のパラメータの型は、"Type": "CommaDelimitedList"
とします。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Lambda Function resource stack creation using Amplify CLI",
"Parameters": {
...
"s3Key": {...},
+ // 2-2. パラメータ定義(上の行のカンマも追加必要)
+ "subnetIds": {
+ "Type": "CommaDelimitedList"
+ },
+ "securityGroupIds": {
+ "Type": "CommaDelimitedList"
+ }
+ // 2-2 ここまで
},
"Conditions": {...},
"Resources": {
"LambdaFunction": {
+ // 2-4. リソースの構築順指定
+ // (2-1のIAMポリシー作成後にLambdaFunctionを作成)
+ "DependsOn": [
+ "LambdaExecutionPolicyCustom"
+ ],
+ // 2-4 ここまで
"Type": "AWS::Lambda::Function",
"Metadata": {...},
"Properties": {
...
"Timeout": 25,
+ // 2-3. パラメータを用いてVPC接続設定追加(上の行のカンマも追加必要)
+ "VpcConfig": {
+ "SecurityGroupIds": {
+ "Ref": "securityGroupIds"
+ },
+ "SubnetIds": {
+ "Ref": "subnetIds"
+ }
+ }
+ // 2-3 ここまで
}
},
"LambdaExecutionRole": {...},
"lambdaexecutionpolicy": {...},
+ // 2-1. VPC接続設定に必要なIAMポリシー追加(上の行のカンマも追加必要)
+ "LambdaExecutionPolicyCustom": {
+ "DependsOn": [
+ "LambdaExecutionRole"
+ ],
+ "Type": "AWS::IAM::Policy",
+ "Properties": {
+ "PolicyName": "lambda-execution-policy-custom",
+ "Roles": [
+ {
+ "Ref": "LambdaExecutionRole"
+ }
+ ],
+ "PolicyDocument": {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": [
+ "ec2:CreateNetworkInterface",
+ "ec2:DescribeNetworkInterfaces",
+ "ec2:DeleteNetworkInterface"
+ ],
+ "Resource": "*"
+ }
+ ]
+ }
+ }
+ }
+ // 2-1 ここまで
},
"Outputs": {...}
}
-
...
は省略の意 - 行頭
⁺
は追加行を強調するために使用
(コピペする場合は⁺
を削除すること) - テンプレート内にコメントを記入できますが、次の手順を実施するとコメントは消えます
3. env毎に異なるパラメータ値を設定
パラメータの値はamplify/team-provider-info.json
へList型として指定します。
env毎、lambda関数毎に異なるパラメータを指定できます。
{
"dev": {
"awscloudformation": {...},
"categories": {
"function": {
...
"vpclambda": {
...
+ // 3-1. envがdevの場合のパラメータ値を追加
+ "securityGroupIds": [
+ "sg-XXXXXXXXXXXXXXXXX"
+ ],
+ "subnetIds": [
+ "subnet-XXXXXXXXXXXXXXXXX",
+ "subnet-XXXXXXXXXXXXXXXXX",
+ "subnet-XXXXXXXXXXXXXXXXX"
+ ]
+ // 3-1 ここまで
}
}
}
},
"stg": {
"awscloudformation": {...},
"categories": {
"function": {
...
"vpclambda": {
...
+ // 3-2. envがstgの場合のパラメータ値を追加
+ "securityGroupIds": [
+ "sg-XXXXXXXXXXXXXXXXX"
+ ],
+ "subnetIds": [
+ "subnet-XXXXXXXXXXXXXXXXX",
+ "subnet-XXXXXXXXXXXXXXXXX",
+ "subnet-XXXXXXXXXXXXXXXXX"
+ ]
+ // 3-2 ここまで
}
}
}
}
}
4. ビルド&クラウドへの反映
以下のコマンドを実施します。env毎に実行する必要があります。
amplify push -y
5. 確認
元記事同様、AWSコンソールのlambdaのVPC設定を確認ください。
以下のようにenv毎に別のlambdaが作成されますので、それぞれのlambdaのコンソール画面を確認ください。
- vpclambda-dev
- vpclambda-stg
最後に
この記事を書くにあたって、cloudformationのList型パラメータの扱い方がとても勉強になりました。
"Type": "CommaDelimitedList"
は、知らないとなかなか調べられないですよね。
参考
以下のサイトを参考にさせて頂いています。ありがとうございます。