如何使用 Terraform 创建与 AWS S3 的雪花存储集成?

时间:2021-07-09 04:38:30

标签: amazon-web-services terraform snowflake-cloud-data-platform amazon-iam

我正在尝试使用 Terraform 设置链接到 AWS S3 存储桶的雪花“存储集成”对象。除了标准的 AWS 提供程序之外,我还在使用 Terraform 注册表中的“chanzuckerberg”Snowflake 提供程序。

我遇到的问题是,创建集成的过程的一部分需要以下操作序列:

  1. 使用 S3 访问策略创建 IAM Role
  2. 创建一个 Snowflake Storage Integration 对象,指定在步骤 1 中创建的 IAM 角色
  3. 使用来自存储集成对象的值修改 IAM 角色访问策略

(完整的步骤列表 here

因此,IAM 角色和存储集成之间存在循环依赖关系。第 1 步和第 2 步很简单,但我不确定如何使用 Terraform 实现第 3 步,因为涉及在创建对象后修改对象的状态。

很遗憾,IAM 角色访问策略似乎无法独立于角色本身进行修改。

这样的事情是否可能,或者资源之间的循环关系是否意味着 Terraform 无法处理?

1 个答案:

答案 0 :(得分:0)

具有 IAM 角色的 Terraform 依赖循环有一个简单的解决方法。可以预先计算角色 ARN,然后集成资源就不再依赖于角色。然后角色可以自由使用集成输出。

示例代码:

locals {
  role_name = "my_role"
  role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${local.role_name}"
}

resource "snowflake_storage_integration" "int" {
  storage_aws_role_arn = local.role_arn
  ...
}

resource "aws_iam_role" "role" {
  name = local.role_name
  assume_role_policy = jsonencode({
    "Version" : "2012-10-17"
    "Statement" : [
      {
        "Action" : "sts:AssumeRole"
        "Effect" : "Allow"
        "Principal" : {
          "AWS" : snowflake_storage_integration.int.storage_aws_iam_user_arn
        }
        "Condition" : {
          "StringEquals" : {
            "sts:ExternalId" : snowflake_storage_integration.int.storage_aws_external_id
          }
        }
      }
    ]
  })
}