如何使用Terraform和AWS单点登录在多个账户之间共享AWS基础设施?



我使用AWS SSO进行了以下多帐户设置:

  • 一个名为"infrastructure-owner"的帐户。在此帐户下,有一个名为"someaccesslevel"的角色。在这里我可以点击登录到web控制台。
  • 另一个帐户叫做"基础设施-消费者"。在这个帐户下有一个相同的角色,叫做SomeAccessLevel"在那里我可以点击登录到web控制台。可能还有其他角色。

账户"infrastructure-owner"拥有通常具有读写访问权限的资源(例如S3桶、DynamoDB表或vpn)。这个帐户受到一定程度的保护,很少使用。账户"infrastructure-consumer"仅对"基础设施所有者"中的资源具有读访问权限。此帐户通常由多个人员/服务使用。例如,生产数据管道运行在"基础设施-消费者"中。对"infrastructure-owner"目录下的S3桶具有只读权限。然而,有时,新数据可能会通过登录"infrastructure-owner"手动包含在这些S3桶中。

我想用Terraform提供这个基础设施。我无法为"基础设施-消费者"提供权限。从"infrastructure-owner"访问资源。我读了几十篇关于AWS多账户/SSO/Terraform的博客文章,但我仍然做不到。在这一点上,我甚至不能在web控制台中手动执行。

请注意"SomeAccessLevel"是由AWS创建的角色,我不能修改(通常称为AWSReservedSSO_YOURNAMEHERE_RANDOMSTRING)。另外,我不能给特定用户权限,因为这些用户可能不属于"基础设施-消费者"。此外,用户可以使用角色通过SSO访问此帐户。

下面的Terraform代码是在"基础设施-所有者"中创建的DynamoDB表示例。我想在"基础设施-消费者"一文中读到帐户(任何角色):

# Terraform config
terraform {
required_version = ">= 1.0.0"
required_providers {
aws = {
source  = "hashicorp/aws"
version = "~> 3.44"
}
}
backend "remote" {
hostname = "app.terraform.io"
organization = "YOUR_ORGANIZATION_HERE"
workspaces {
name = "YOUR_TF_WORKSPACE_NAME_HERE"  # linked to "infrastructure-owner" 
}
}
}
# Local provider
provider "aws" {
profile = "YOUR_AWS_PROFILE_NAME_HERE"  # linked to "infrastructure-owner" 
region = "eu-central-1"
}
# Example resource that I would like to access from other accounts like "infrastructure-consumer"
resource "aws_dynamodb_table" "my-database" {
# Basic
name           = "my-database"
billing_mode   = "PAY_PER_REQUEST"
hash_key       = "uuid"
# Key
attribute {
name = "uuid"
type = "S"
}
}
# YOUR CODE TO ALLOW "infrastructure-consumer" TO READ THE TABLE.

对于这个用例,也可能存在更好的体系结构。我正在尝试遵循用于生产环境的AWS多帐户的一般实践,以及用于提供它们的Terraform。

谢谢!

我想你是指AWS账户,而不是IAM账户(用户)。

我记得通过AWS SSO假设的角色有一些叫做权限集的东西,这只不过是一个策略,在假设角色时允许或拒绝执行API操作。我不知道AWS SSO如何影响角色信任在AWS中的工作方式,但是您可以在基础设施所有者的帐户中拥有一个角色。信任基础设施中的任何东西-消费者帐户,即信任"arn:aws:iam::${var.infrastructure-consumer's account}:root"

要使用Terraform实现这一点,您需要在您的管理帐户(SSO管理员帐户)中运行它并使信任发生。

最新更新