【问题标题】:How to grant lambda permission to upload file to s3 bucket in `terraform`?如何授予 lambda 权限以将文件上传到 `terraform` 中的 s3 存储桶?
【发布时间】:2021-01-14 03:01:05
【问题描述】:

我在TerraForm 中有以下 lambda 函数配置:

resource "aws_lambda_function" "test_lambda" {
  # filename         = "crawler/dist/deploy.zip"
  s3_bucket = "${var.s3-bucket}"
  s3_key    = "${aws_s3_bucket_object.file_upload.key}"
  # source_code_hash = "${filebase64sha256("file.zip")}"
  function_name    = "quote-crawler"
  role             = "arn:aws:iam::773592622512:role/LambdaRole"
  handler          = "handler.handler"
  source_code_hash = "${data.archive_file.zipit.output_base64sha256}"
  runtime          = "${var.runtime}"
  timeout          = 180

  environment {
    variables = {
      foo = "bar"
    }
  }
}

当我运行 lambda 时,当它尝试将文件上传到 s3 存储桶时出现错误 "errorMessage": "An error occurred (AccessDenied) when calling the PutObject operation: Access Denied",。似乎 lambda 函数没有访问 s3 的权限。 TerraForm doc 不清楚如何配置它们。权限配置面板也不会出现在lambda console 上。 TerraForm 创建的 lambda 似乎对我的使用配置有限。那么如何将 s3 权限授予 lambda?

【问题讨论】:

    标签: amazon-s3 aws-lambda terraform


    【解决方案1】:

    为方便起见,您可以分三个步骤完成此操作,

    1. 创建角色
    2. 创建策略
    3. 角色的附加政策
    4. 附加到 lambda 的角色

    创建角色。

    resource "aws_iam_role" "role" {
      name = "${var.env_prefix_name}-alb-logs-to-elk"
      path = "/"
    
          assume_role_policy = <<EOF
        {
    
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Principal": {
            "Service": "lambda.amazonaws.com"
          },
          "Effect": "Allow",
          "Sid": ""
        }
      ]
    }
    EOF
    }
    

    创建一个对 s3 具有指定访问权限的策略

     #Created Policy for IAM Role
    resource "aws_iam_policy" "policy" {
      name = "${var.env_prefix_name}-test-policy"
      description = "A test policy"
    
    
          policy = <<EOF
       {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
    
    } 
        EOF
        }
    

    附加的 IAM 角色和新创建的策略

    resource "aws_iam_role_policy_attachment" "test-attach" {
      role       = "${aws_iam_role.role.name}"
      policy_arn = "${aws_iam_policy.policy.arn}"
    }
    

    现在将角色附加到 Lamba 源

    resource "aws_lambda_function" "test_lambda" {
      # filename         = "crawler/dist/deploy.zip"
      s3_bucket = "${var.s3-bucket}"
      s3_key    = "${aws_s3_bucket_object.file_upload.key}"
      # source_code_hash = "${filebase64sha256("file.zip")}"
      function_name    = "quote-crawler"
      role             = "${aws_iam_role.role.arn}"
      handler          = "handler.handler"
      source_code_hash = "${data.archive_file.zipit.output_base64sha256}"
      runtime          = "${var.runtime}"
      timeout          = 180
    
      environment {
        variables = {
          foo = "bar"
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      与函数关联的 IAM 角色不允许上传到 S3。

      解决方案是创建一个允许 S3 访问您的存储桶(例如读/写)的 IAM 策略,如下所示:

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "ListObjectsInBucket",
                  "Effect": "Allow",
                  "Action": ["s3:ListBucket"],
                  "Resource": ["arn:aws:s3:::bucket-name"]
              },
              {
                  "Sid": "AllObjectActions",
                  "Effect": "Allow",
                  "Action": "s3:*Object",
                  "Resource": ["arn:aws:s3:::bucket-name/*"]
              }
          ]
      }
      

      然后,您需要将此策略附加到您的 lambda 函数使用的角色。

      更多信息请访问: https://www.terraform.io/docs/providers/aws/r/iam_role_policy.html

      【讨论】:

        【解决方案3】:

        我会按以下顺序进行:

        此代码使用 terraform 0.12.*

        1. 为代入角色和 s3 权限创建策略文档
        data aws_iam_policy_document lambda_assume_role {
          statement {
            actions = ["sts:AssumeRole"]
        
            principals {
              type        = "Service"
              identifiers = ["lambda.amazonaws.com"]
            }
          }
        }
        
        data aws_iam_policy_document lambda_s3 {
          statement {
            actions = [
              "s3:PutObject",
              "s3:PutObjectAcl"
            ]
        
            resources = [
              "arn:aws:s3:::bucket/*"
            ]
          }
        }
        
        1. 创建 IAM 策略
        resource aws_iam_policy lambda_s3 {
          name        = "lambda-s3-permissions"
          description = "Contains S3 put permission for lambda"
          policy      = data.aws_iam_policy_document.lambda_s3.json
        }
        
        1. 创建角色
        resource aws_iam_role lambda_role {
          name               = "lambda-role"
          assume_role_policy = data.aws_iam_policy_document.lambda_assume_role.json
        }
        
        1. 将策略附加到角色
        resource aws_iam_role_policy_attachment lambda_s3 {
          role       = aws_iam_role.lambda_role.name
          policy_arn = aws_iam_policy.lambda_s3.arn
        }
        
        1. 将角色附加到 lambda
        resource "aws_lambda_function" "test_lambda" {
          # filename         = "crawler/dist/deploy.zip"
          s3_bucket = var.s3-bucket
          s3_key    = aws_s3_bucket_object.file_upload.key
          # source_code_hash = "${filebase64sha256("file.zip")}"
          function_name    = "quote-crawler"
          role             = aws_iam_role.lambda_role.arn
          handler          = "handler.handler"
          source_code_hash = data.archive_file.zipit.output_base64sha256
          runtime          = var.runtime
          timeout          = 180
        
          environment {
            variables = {
              foo = "bar"
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-11-09
          • 1970-01-01
          • 2020-08-21
          • 2023-01-12
          • 1970-01-01
          • 2018-04-29
          • 2019-09-14
          • 1970-01-01
          • 2016-09-05
          相关资源
          最近更新 更多