如何授予lambda将文件上传到terraform中的s3存储桶的权限?

时间:2019-07-22 11:44:08

标签: amazon-s3 aws-lambda terraform

我在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文档尚不清楚如何配置它们。权限配置面板也不会出现在lambda console上。由TerraForm创建的lambda似乎配置有限,我无法使用。那么如何授予s3的lambda权限?

3 个答案:

答案 0 :(得分:2)

与该功能关联的IAM角色不允许上载到S3。

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

{
    "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

答案 1 :(得分:0)

要简化操作,您可以分三个步骤进行操作,

  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 :(得分:0)

我会按以下顺序进行:

<块引用>

此代码使用 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"
    }
  }
}