【问题标题】:Terraform module to create S3 bucket for lambda function which is accessible cross account?Terraform 模块为跨账户访问的 lambda 函数创建 S3 存储桶?
【发布时间】:2018-08-02 04:50:06
【问题描述】:

我是 Terraform 的新手,我正在尝试为可跨账户访问的 Lambda 函数创建 Terraform 模块 S3 存储桶。此外,跨帐户访问应仅限于列出和获取对象。

以下是我创建 lambda 的内容:

resource "aws_lambda_function" "test_lambda" {
  filename         = "lambda_function_payload.zip"
  s3_bucket        = "my_bucket_name"
  function_name    = "lambda_function_name"
  role             = "${aws_iam_role.iam_for_lambda.arn}"
  handler          = "exports.test"
  source_code_hash = "${base64sha256(file("lambda_function_payload.zip"))}"
  runtime          = "nodejs4.3"
}

这就是我的 s3 存储桶代码的样子:

resource "aws_s3_bucket" "bucket" {
  bucket = "my-bucket"
  acl    = "private"

  lifecycle_rule {
    id      = "log"
    enabled = true

    prefix = "log/"

    tags {
      "rule"      = "log"
      "autoclean" = "true"
    }

    transition {
      days          = 30
      storage_class = "STANDARD_IA"
    }

    transition {
      days          = 60
      storage_class = "GLACIER"
    }

    expiration {
      days = 90
    }
  }

  lifecycle_rule {
    id      = "tmp"
    prefix  = "tmp/"
    enabled = true

    expiration {
      date = "2016-01-12"
    }
  }

  #Using this section for cors_rule
  cors_rule {
    allowed_headers = ["*"]
    allowed_methods = ["GET"]
    allowed_origins = ["https://s3-website-test.hashicorp.com"]
  }
}

我怎样才能把它变成一个模块?

【问题讨论】:

    标签: amazon-s3 terraform


    【解决方案1】:

    official documentation 中描述了必要的策略。在下文中,我将描述如何使用单个 terraform 模块设置此示例 - 您必须根据需要调整权限。您还可以扩展它,以支持超过 2 个 AWS 账户。我自己没有运行以下代码,因此可能存在一些拼写错误等,但它应该可以帮助您了解其背后的总体思路。

    假设 AWS 账户 A 是您的 s3 存储桶所在的账户,AWS 账户 B 是您运行 lambda 函数的账户。

    为了将所有内容都放在一个模块中,您必须定义 2 个 Terraform AWS 提供商;每个涉及的 AWS 账户一个。

    // Your s3 bucket's provider - used by default
    provider "aws" {
      .. // your setup here
    }
    
    // Your lambda function's provider - used if specified via alias
    provider "aws" {
      .. // your setup here
    
      alias = "lambda"
    }
    

    首先,将策略附加到您的 s3 存储桶以允许来自账户 B 的访问:

    data "aws_caller_identity" "lambda" {
      provider = "aws.lambda"
    }
    
    data "aws_iam_policy_document" "s3_cross_account" {
      policy_id = "Cross account access for s3"
    
      statement {
        sid= "1"
    
        principals {
          type        = "AWS"
          identifiers = ["arn:aws:iam::${data.aws_caller_identity.lambda.account_id}:root"]
        }
    
        actions    = [""s3:GetBucketLocation", "s3:ListBucket"]
        resources  = ["arn:aws:s3:::${aws_s3_bucket.bucket.bucket}"]
      }
    }
    
    resource "aws_s3_bucket_policy" "s3_cross_account" {
      bucket = "${aws_s3_bucket.bucket.id}"
      policy = "${data.aws_iam_policy_document.s3_cross_account.json}"
    }
    

    接下来,在 AWS 账户 B 中创建一个可由您的 lambda 函数使用的角色:

    data "aws_iam_policy_document" "access_cross_account_s3" {
      provider = "aws.lambda"
    
      policy_id = "Cross account access for s3"
    
      statement {
        sid= "1"
    
        actions    = ["s3:ListBucket"]
        resources  = ["arn:aws:s3:::${aws_s3_bucket.bucket.bucket}"]
      }
    }
    
    resource "aws_iam_role" "s3_cross_account" {
      provider = "aws.lambda"
    
      name = "s3_cross_account"
      assume_role_policy = "${data.aws_iam_policy_document.access_cross_account_s3.json}"
    }
    

    您的 lambda 函数代码块还必须设置 provider = "aws.lambda" 配置,因此它是在 AWS 账户 B 中创建的。

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2020-06-24
      • 2020-03-29
      • 2016-03-17
      • 2019-04-23
      • 2021-06-28
      • 2021-12-02
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多