概要
AWS CDKでLambdaのIAMロールに任意のポリシーをアタッチしようとすると以下のエラーになりました。
The provided execution role does not have permissions to call CreateNetworkInterface on EC2
lambda_role = iam.Role(self, "Sample-LambdaServiceRole",
assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
role_name="Sample-LambdaServiceRole"
)
lambda_policy = iam.Policy(self, "Sample-LambdaPolicy",
policy_name="Sample-LambdaPolicy",
statements=[
iam.PolicyStatement(
actions=[
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:CreateNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DeleteNetworkInterface"
],
resources=["*"]
),
iam.PolicyStatement(
actions=[
"secretsmanager:GetSecretValue"
],
resources=[
f"arn:aws:secretsmanager:ap-northeast-1:{self.account}:secret:*"
]
),
]
)
lambda_policy.attach_to_role(lambda_role)
解決方法
結論、以下であればエラーが出ずにデプロイできました。
lambda_role = iam.Role(self, "Sample-LambdaServiceRole",
assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
role_name="Sample-LambdaServiceRole"
)
lambda_role.add_managed_policy(
iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaVPCAccessExecutionRole")
)
lambda_policy = iam.Policy(self, "Sample-LambdaPolicy",
policy_name="Sample-LambdaPolicy",
statements=[
iam.PolicyStatement(
actions=[
"secretsmanager:GetSecretValue"
],
resources=[
f"arn:aws:secretsmanager:ap-northeast-1:{self.account}:secret:*"
]
),
]
)
変更したのは、アタッチするポリシーをAWS管理ポリシーのAWSLambdaVPCAccessExecutionRole
にしたことです。なぜこれにより通るようになったか?は不明です(ご存じの方いらっしゃったらコメントで教えてください!)。
いずれにせよ、AWS が提供するベストプラクティスに従った権限設定が適用された方が良いでしょう。
以前も同じようなエラーになったのですが、同様にAWS管理ポリシーにすることでエラーがなくなったことがありました。ご参考までに。