在Terraform中如何在不同的AWS账户中保留S3远程状态

41次阅读
没有评论

问题描述

正在使用Terraform与S3远程状态。他的IAM用户位于与持有远程状态文件的S3存储桶相同的AWS账户中,这一切都运行良好。然而,他在其他AWS账户中有IAM用户(都是同一AWS组织的一部分),他想授权他们在主账户中使用Terraform。他认为应该可以通过IAM角色来实现这一点。他在主账户中创建了一个IAM角色,并配置了aws提供程序的assume_role属性,以在主AWS账户中扮演角色。然而,这个方法失败了,因为其他AWS账户中的用户无法访问S3中的远程状态文件。他尝试将远程状态文件的访问权限授予IAM角色,但Terraform显然尝试在加载aws提供程序并扮演新IAM角色之前获取状态。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在这种情况下,你可以通过两种方法来实现不同AWS账户中的S3远程状态的访问。

方法一:为每个账户扮演角色

这个方法涉及为每个需要访问S3远程状态的AWS账户创建一个角色,并通过assume_role在每个账户中扮演该角色。以下是具体步骤:

  1. 在主AWS账户中创建一个IAM角色,该角色具有访问S3存储桶的权限。
  2. 在每个需要访问远程状态的AWS账户中,创建一个与上述角色信任关系的IAM角色。
  3. 在Terraform配置文件中,对于每个账户,配置aws提供程序的assume_role属性为对应的IAM角色ARN。
  4. 在各个账户中,通过Terraform运行配置。

以下是一个示例Terraform配置文件片段:

provider "aws" {
  region = "us-west-2"
}

provider "aws" {
  alias  = "account_b"
  region = "us-west-2"
  assume_role {
    role_arn = "arn:aws:iam::ACCOUNT_B_ID:role/RoleName"
  }
}

data "aws_caller_identity" "current" {}

resource "aws_s3_bucket" "example" {
  provider = aws.account_b
  # ...其他配置...
}

方法二:通过S3 UI授权访问

这个方法涉及通过S3的UI界面直接授权其他AWS账户访问S3存储桶中的对象。这并不是Terraform的正式支持方式,但是可以手动进行。以下是具体步骤:

  1. 登录到AWS Management Console,打开S3控制台。
  2. 选择持有远程状态文件的S3存储桶。
  3. 进入“Permissions”(权限)选项卡,然后选择“Access Control List”(访问控制列表)。
  4. 在“Access for other AWS accounts”(其他AWS账户的访问权限)中,添加需要访问的AWS账户。
  5. 找到需要授权的AWS账户的Canonical ID(可以通过链接找到)。
  6. 配置桶级别和对象级别的权限,确保其他账户具有访问权限。

需要注意的是,使用这种方法时,对象的所有者(Principal)将会变为授权的账户,而实际托管桶的主账户可能无法访问对象。

结论

在Terraform中,可以通过角色扮演或手动授权的方式,实现在不同AWS账户中访问S3远程状态。你可以根据具体情况选择合适的方法来满足你的需求。

请确保在执行任何涉及访问权限的操作之前,充分了解安全性和访问控制的最佳实践。

总结

当需要在不同的AWS账户中访问S3远程状态时,你可以使用方法一中的角色扮演方式,或者通过S3 UI手动授权其他账户访问权限。具体选择取决于你的需求和安全性考虑。无论选择哪种方式,都需要仔细配置和管理访问权限,以确保安全和正确性。

正文完