概要
- lambda関数からEC2にアクセスしたい場合にlambdaに付与するロールに追加するユーザー定義ポリシーを紹介する
作りたいもの
- VPC内にあるEC2インスタンス内にあるWebサーバーにあるAPIエンドポイントにLambda関数(Node.js)からリクエストを贈りたい。
- その際にEC2インスタンスを指定してlambda → EC2インスタンスのアクセスを許可したい。
結論
-
特定のEC2インスタンスにしかアクセスさせたくないので下記の様に定義する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": "arn:aws:ec2:ap-northeast-1:当該EC2の詳細の「所有者」の数字:instance/当該EC2の概要にある「インスタンスID」" } ] }
-
前述のJSONをユーザー定義ポリシーとして作成しlambda関数に割り当てられているロールにそのユーザー定義ポリシーを追加する。
方法
-
「lambdaをEC2と同じVPCに設置してEC2にアクセスする」ためのポリシーは実はAWSが既に用意してくれている。そのポリシーが
AWSLambdaVPCAccessExecutionRole
ポリシーである。 -
下記に当該のポリシーを記載する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": "*" } ] }
-
ぶっちゃけ↑のポリシーをlambdaのロールに付与すれば事は済む。
-
ただリソース(EC2インスタンス)が指定されていないからAWSの言う「最小の権限」にはなってない。
-
そこで下記の記事を参考にEC2のインスタンスをarnで指定してあげただけである。