See*_*r90 9 amazon-web-services aws-lambda terraform terraform-provider-aws
我正在尝试将 lambda 函数的日志写入由 terraform 创建的 CloudWatch 日志组。
这是 lambda 策略 json -
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1580216411252",
"Action": [
"logs:CreateLogStream",
"logs:CreateLogDelivery",
"logs:PutLogEvents"
],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是 lambda 假设策略 json -
{
"Version": "2012-10-17",
"Statement": [{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}]
}
Run Code Online (Sandbox Code Playgroud)
我已将其添加到 lambda.tf 文件中 -
resource "aws_cloudwatch_log_group" "example" {
name = "/test/logs/${var.lambda_function_name}"
}
Run Code Online (Sandbox Code Playgroud)
尽管 CloudWatch 日志组“/test/logs/${var.lambda_function_name}”是通过 terraform 创建的,但我无法将 lambda 函数的日志写入该组。
如果我将 lambda 策略 json 更改为 -
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "Stmt1580204738067",
"Action": "logs:*",
"Effect": "Allow",
"Resource": "*"
}]
}
Run Code Online (Sandbox Code Playgroud)
然后它会自动将日志存储在 /aws/lambda/ 目录中。
如何确保 lambda 日志写入我创建的 CloudWatch 日志组中,而不是写入 lambda 本身创建的 /aws/lambda/ 组中?
mil*_*ere 10
仅将日志组添加为 lambda 的依赖项是不够的。您还必须将 IAM 策略附加到 lambda 角色。
步骤如下:
resource "aws_iam_role" "iam_for_lambda" {
name = "iam_for_lambda"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}]
}
EOF
}
Run Code Online (Sandbox Code Playgroud)
resource "aws_iam_policy" "function_logging_policy" {
name = "function-logging-policy"
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
Action : [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
Effect : "Allow",
Resource : "arn:aws:logs:*:*:*"
}
]
})
}
Run Code Online (Sandbox Code Playgroud)
resource "aws_iam_role_policy_attachment" "function_logging_policy_attachment" {
role = aws_iam_role.iam_for_lambda.id
policy_arn = aws_iam_policy.function_logging_policy.arn
}
Run Code Online (Sandbox Code Playgroud)
resource "aws_cloudwatch_log_group" "lambda_log_group" {
name = "/aws/lambda/${var.lambda.function_name}"
retention_in_days = 7
lifecycle {
prevent_destroy = false
}
}
Run Code Online (Sandbox Code Playgroud)
resource "aws_lambda_function" "lambda_function" {
filename = "../${var.lambda.function_filename}"
function_name = "${var.lambda.function_name}"
role = aws_iam_role.iam_for_lambda.arn
handler = "${var.lambda.handler}"
layers = [aws_lambda_layer_version.lambda_layer.arn]
depends_on = [aws_cloudwatch_log_group.lambda_log_group]
source_code_hash = filebase64sha256("../${var.lambda.function_filename}")
runtime = "python3.9"
}
Run Code Online (Sandbox Code Playgroud)
IAM 策略创建和附件来自本文,其余部分来自为我工作的个人项目。
如果您希望 Terraform 管理 CloudWatch 日志组,则必须使用 Lambda 函数将用于其日志组的确切名称提前创建日志组。你根本无法改变名字。然后,在 Terraform 中,您需要使日志组成为 Lambda 函数的依赖项,以确保 Terraform 有机会在 Lambda 自动创建日志组之前创建日志组。
归档时间: |
|
查看次数: |
12291 次 |
最近记录: |