事象
- VPC 内に Lambda 関数を作成しようとすると以下のエラーが発生する。
The provided execution role does not have permissions to call CreateNetworkInterface on EC2
原因
- Lambda 関数作成時に関数にアタッチした実行ロールに ec2:CreateNetworkInterface 権限がないため。
解決策
- Lambda 関数にアタッチする実行ロールに AWS マネージドポリシー "AWSLambdaVPCAccessExecutionRole" を付与する。
{ "Version" : "2012-10-17", "Statement" : [ { "Sid" : "AWSLambdaVPCAccessExecutionPermissions", "Effect" : "Allow", "Action" : [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DeleteNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource" : "*" } ] }AWSLambdaVPCAccessExecutionRole - AWS 管理ポリシー
補足
- 必要最低限のIAM権限のみ付与するために、以下の IAM ポリシーをLambda 関数の実行ロールにアタッチすることが望ましい。
- Lambda 関数が自関数実行時以外に EC2 API を実行するのを防止するため 。
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": [ "arn:aws:lambda:us-west-2:123456789012:function:my_function" <-- Lambda 関数の ARN ] } } } ] }
設定例
- Lambda関数: LambdaFuncInVpc
- 実行ロール: LambdaFuncInVpc_Role
- IAMポリシー: AWSLambdaVPCAccessExecutionRole(AWS マネージドポリシー)
- IAMポリシー: LambdaFuncInVpc_DenyPolicy
- 実行ロール: LambdaFuncInVpc_Role
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": [ "arn:aws:lambda:ap-northeast-1:123456789012:function:LambdaFuncInVpc" ] } } } ] }
参考
Lambda 関数の作成がThe provided execution role does not have permissions to call CreateNetworkInterface on EC2で失敗しました。
Lambda で「The provided execution role does not have permissions to call CreateNetworkInterface on EC2」になったときの対処方法 | DevelopersIO
実行した IAM ユーザにはAdministratorAccessが付与されており、権限不足はない認識です。 Lambda 関数を作成するにはどうしたら良いでしょうか?
Lambda 関数をAWS アカウント の Amazon VPC にアタッチするには、Lambda が VPC 内のリソースへのアクセスを関数に許可するために使用するネットワークインターフェイスを作成および管理するためのアクセス許可が必要です。
Lambda が作成するネットワークインターフェイスは、Hyperplane Elastic Network Interface または Hyperplane ENI と呼ばれます。これらのネットワークインターフェイスの詳細については、「Elastic Network Interface (ENI) について」を参照してください。
AWS マネージドポリシーである AWSLambdaVPCAccessExecutionRole を関数の実行ロールにアタッチすることで、必要な許可を関数に付与できます。Lambda コンソールで新しい関数を作成して VPC にアタッチすると、Lambda は自動的にこのアクセス許可ポリシーを追加します。
独自の IAM 許可ポリシーを作成する場合は、次の許可をすべて追加して、すべてのリソース ("Resource": "*") にそれらを許可してください。
- ec2:CreateNetworkInterface
- ec2:DescribeNetworkInterfaces
- ec2:DescribeSubnets
- ec2:DeleteNetworkInterface
- ec2:AssignPrivateIpAddresses
- ec2:UnassignPrivateIpAddresses
関数のロールにこれらのアクセス許可が必要なのは、関数を呼び出すためではなく、ネットワーク インターフェイスを作成するためだけであることに注意してください。関数の実行ロールからこれらのアクセス許可を削除しても、関数が Amazon VPC にアタッチされたときにその関数を正常に呼び出すことができます。
関数を VPC にアタッチするには、Lambda も IAM ユーザーロールを使用してネットワークリソースを検証する必要があります。ユーザー ロールに次の IAM アクセス許可があることを確認してください。
- ec2:DescribeSecurityGroups
- ec2:DescribeSubnets
- ec2:DescribeVpcs
- ec2:GetSecurityGroupsForVpc
注記
Lambda 関数に Amazon VPC 内のリソースへのアクセスを許可する - AWS Lambda
関数の実行ロールに付与する Amazon EC2 許可は、関数を VPC にアタッチするために Lambda サービスが使用します。ただし、これらのアクセス許可を関数のコードに暗黙的に付与することになります。これは、関数コードがこれらの Amazon EC2 API コールを実行できることを意味します。セキュリティのベストプラクティスに従うためのアドバイスについては、「セキュリティのベストプラクティス」を参照してください。
{ "Version" : "2012-10-17", "Statement" : [ { "Sid" : "AWSLambdaVPCAccessExecutionPermissions", "Effect" : "Allow", "Action" : [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DeleteNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource" : "*" } ] }AWSLambdaVPCAccessExecutionRole - AWS Managed Policy
Lambda 関数に Amazon VPC 内のリソースへのアクセスを許可する - AWS Lambdaセキュリティのベストプラクティス
Lambda 関数を VPC にアタッチするには、関数の実行ロールに複数の Amazon EC2 アクセス許可を付与する必要があります。これらのアクセス許可は、関数が VPC 内のリソースにアクセスするために使用するネットワークインターフェイスを作成するために必要です。ただし、これらのアクセス許可は関数のコードにも暗黙的に付与されます。つまり、関数コードにはこれらの Amazon EC2 API コールを行うアクセス許可が付与されます。
最小特権アクセスの原則に従うには、次の例のような拒否ポリシーを関数の実行ロールに追加します。このポリシーは、関数コードが Amazon EC2 API を呼び出すのを防ぎ、Lambda サービスがユーザーに代わって VPC リソースを管理できるようにします。ポリシーは lambda:SourceFunctionArn 条件キーを使用します。これは、実行中に関数コードによって行われた API コールにのみ適用されます。詳細については、「ソース関数 ARN を使用した関数のアクセス動作の制御」を参照してください。
JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": [ "arn:aws:lambda:us-west-2:123456789012:function:my_function" ] } } } ] }