Aws lambda 用于向AWS Lambda添加权限的正确terraform语法
我正在学习Terraform,并试图获得正确的语法来指定它的IAM角色权限。我想要这些能力:Aws lambda 用于向AWS Lambda添加权限的正确terraform语法,aws-lambda,terraform,Aws Lambda,Terraform,我正在学习Terraform,并试图获得正确的语法来指定它的IAM角色权限。我想要这些能力: Lambda可以从我在Terraform中创建的API网关调用 Lambda可以写入Cloudwatch日志 我有以下允许API网关调用Lambda的功能: resource "aws_iam_role" "my_lambda_execution_role" { name = "my_lambda_execution_role" assume_role_policy = <<EOF
resource "aws_iam_role" "my_lambda_execution_role" {
name = "my_lambda_execution_role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"apigateway.amazonaws.com"
]
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
您需要创建策略,然后将其附加到您的角色。上面的链接包括一个比iam角色页面上更完整的示例。- IAM策略以及角色
- 请在我的网站上找到完整的地形代码
资源“aws\u iam\u role”“my\u lambda\u execution\u role”
块中的假定角色策略
参数中给出的策略是管理允许哪些用户和服务“假定”此角色的策略。在本例中,您允许AWS Lambda和Amazon API网关使用此角色授予的权限发出请求
但是,默认情况下,角色根本不授予任何特权。为了解决这个问题,我们需要为角色附加一个或多个访问策略。您在此处共享的另一个策略是访问策略,要将其与角色关联,我们需要使用aws\u iam\u role\u策略
资源类型:
resource "aws_iam_role_policy" "logs" {
name = "lambda-logs"
role = aws_iam_role.my_lambda_execution_role.name
policy = jsonencode({
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*",
}
]
})
}
通常Terraform会通过注意到类似于aws\u iam\u角色的引用,自动推断resource
块之间的依赖关系,实际上,在这种情况下,Terraform将自动确定在尝试将策略附加到角色之前需要完成角色的创建
但是,Terraform在此无法自动看到策略附件必须在策略本身可操作之前完成,因此当您从API网关和Lambda资源中引用角色时,您必须使用依赖来告诉Terraform策略附件必须在策略可用之前完成:
resource "aws_lambda_function" "example" {
filename = "${path.module}/example.zip"
function_name = "example"
role = aws_iam_role.my_lambda_execution_role.arn
handler = "example"
# (and any other configuration you need)
# Make sure the role policy is attached before trying to use the role
depends_on = [aws_iam_role_policy.logs]
}
如果您不这样使用dependens_on
,则存在在角色附件完成之前创建和执行函数的风险,因此函数的初始执行可能无法写入其日志。如果函数创建后没有立即执行,那么在实践中可能不会发生这种情况,但最好将所依赖的
包括在内,以便彻底执行,并让未来的人工维护人员知道角色的访问策略对Lambda函数的功能也很重要
resource "aws_iam_role_policy" "logs" {
name = "lambda-logs"
role = aws_iam_role.my_lambda_execution_role.name
policy = jsonencode({
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*",
}
]
})
}
resource "aws_lambda_function" "example" {
filename = "${path.module}/example.zip"
function_name = "example"
role = aws_iam_role.my_lambda_execution_role.arn
handler = "example"
# (and any other configuration you need)
# Make sure the role policy is attached before trying to use the role
depends_on = [aws_iam_role_policy.logs]
}