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

How to create a Snowflake Storage Integration with AWS S3 with Terraform?

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

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

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

(完整的步骤列表 here

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

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

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

具有 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
          }
        }
      }
    ]
  })
}

此模块已帮助实现 turn-key 部署。

https://github.com/Snowflake-Labs/terraform-snowflake-storage-integration

如果有帮助请告诉我。