Amazon web services 试图将地形国家集中起来,并将角色和政策弄得非常混乱

Amazon web services 试图将地形国家集中起来,并将角色和政策弄得非常混乱,amazon-web-services,terraform,terraform-provider-aws,Amazon Web Services,Terraform,Terraform Provider Aws,我有8个AWS账户,我正在迁移到terraform'd。将现有资源导入状态文件、完成定义直到计划为空的缓慢过程。长篇大论,但这是一个有效的过程 推荐的做法之一是将状态文件保留在回购之外,因此我将状态保存在S3中(使用DynamoDB中的锁) 在本地,通过为所有帐户设置我的~/.aws/credentials文件,我可以在本地运行terraform,所有状态都进入bucket。但这是因为我在backend.tf文件中使用了profile=“management” 我想将地形形成转移到我们的管道中,

我有8个AWS账户,我正在迁移到terraform'd。将现有资源导入状态文件、完成定义直到计划为空的缓慢过程。长篇大论,但这是一个有效的过程

推荐的做法之一是将状态文件保留在回购之外,因此我将状态保存在S3中(使用DynamoDB中的锁)

在本地,通过为所有帐户设置我的
~/.aws/credentials
文件,我可以在本地运行terraform,所有状态都进入bucket。但这是因为我在backend.tf文件中使用了
profile=“management”

我想将地形形成转移到我们的管道中,所以有多个共享凭证浮动不是很好。我们可以提供AWS_ACCESS_KEY、AWS_SECRET_ACCESS_KEY和AWS_DEFAULT_REGION作为管道中的环境变量。对于管理帐户,这很好,因此我们现在有管道来进行部署,我们很高兴

我们不能使用多个环境变量,因为Terraform不允许在后端定义中使用任何变量

因此,我正在尝试解决如何“共享”对状态文件的访问并锁定

我认为(我可能错了),但管理账户中存在的“地形化角色”的想法似乎是一种明智的做法,它允许指定用户承担该角色并与国家互动。但我不明白

所以,你能不能回顾一下我的情况,给我指出正确的方向,或者,请帮我解决这个问题

因此,management state.tf文件是(S3 bucket和DynamoDB表资源被截断)

有了这个,我的AWS管理控制台显示了这个角色,一切看起来都很好。它显示了策略验证满意的策略。它显示受信任的帐户

一切看起来都很好

因此,现在转到devops帐户(运行我们的管道和其他非生产任务)

正在工作的backend.tf(使用
~/.aws/credentials
中的共享凭据)如下所示

terraform {
  backend "s3" {
    bucket         = "management-state-bucket"
    acl            = "private"
    encrypt        = true
    region         = "eu-west-1"
    dynamodb_table = "terraform_locks"
    key            = "devops.tfstate"
    profile        = "management"
}

因此,为了让它像在管道中一样工作,我隐藏了管理和devops帐户的
~/.aws/credentials
条目,并使用envvars
aws\u ACCESS\u KEY=akain。。。AWS\u密码\u访问\u密钥=。。。AWS_DEFAULT_REGION=eu-west-1地形…

如果我还添加
TF_LOG=trace
我可以看到正确的凭证提供程序正在使用中:
2020/04/07 10:40:07[INFO]AWS身份验证提供程序已使用:“EnvProvider”

我已经尝试使用devops.tf中的管理凭据

   access_key     = "AKIAJ5..."
   secret_key     = "..."
这起作用了,所以现在要去掉证书

我原以为我可以为地形角色添加角色学习条目,但那不起作用

    role_arn       = "arn:aws:iam::5[SNIPPED]:role/Terraforming"
角色的ARN是该角色的管理控制台中显示的ARN。 该角色表示允许使用devops帐户(4xxx)。 所以我被难住了


任何帮助都将不胜感激。

我的解决方案基于根帐户不能承担角色的新知识

因此,管理帐户需要一个用户(Terraformer)。此用户有一个策略,允许其担任OrganizationAccountAccessRole的devops角色,以及访问管理帐户中与状态相关的资源

此用户用于将terraform应用于非管理帐户


这对我来说简单多了。

我的解决方案基于根帐户不能承担角色的新知识

因此,管理帐户需要一个用户(Terraformer)。此用户有一个策略,允许其担任OrganizationAccountAccessRole的devops角色,以及访问管理帐户中与状态相关的资源

此用户用于将terraform应用于非管理帐户

对我来说简单多了

    role_arn       = "arn:aws:iam::5[SNIPPED]:role/Terraforming"
2020/04/07 11:31:20 [INFO] AWS Auth provider used: "EnvProvider"
2020/04/07 11:31:20 [INFO] Attempting to AssumeRole arn:aws:iam::5[SNIPPED]:role/Terraforming (SessionName: "", ExternalId: "", Policy: "")

Error: The role "arn:aws:iam::5[SNIPPED]:role/Terraforming" cannot be assumed.

  There are a number of possible causes of this - the most common are:
    * The credentials used in order to assume the role are invalid
    * The credentials do not have appropriate permission to assume the role
    * The role ARN is not valid