Aws lambda 用于向AWS Lambda添加权限的正确terraform语法

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

我正在学习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
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Principal": {
            "Service": [ 
              "lambda.amazonaws.com",
              "apigateway.amazonaws.com"
            ]
          },
          "Effect": "Allow",
          "Sid": ""
        }
      ]
    }
    EOF
    }
    

    您需要创建策略,然后将其附加到您的角色。上面的链接包括一个比iam角色页面上更完整的示例。

    • 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]
    }