我想了一会儿如何以最好的方式解释这一点。我有两个AWS帐户,我正试图与PROD和MGMT建立跨帐户角色。
大局;在我的bitbucket repo中,有一个terraform ACM模块,它使用OpenID Connect执行并与AWS(MGMT帐户(进行身份验证,并承担SCM角色,使用此角色,脚本在MGMT帐户上创建证书,并通过在PROD帐户中创建CNAME记录来验证该证书。
当脚本试图验证记录时,证书会被创建,但由于访问被拒绝,证书失败了,尽管我在SCM角色下有一个sts角色,并且PROD上有一个角色可以让SCM角色完全访问Route53。
MGMT账户下的角色:ARN:arn:aws:iam::987654321:role/bitbucket.pipelines
sts在供应链管理下承担MGMT账户中的角色:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "arn:aws:iam::123456789:role/AWS-SCM-ROLE"
}}
PROD帐户中的角色ARN:arn:aws:iam::123456789:role/AWS-SCM-ROLE
:信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::987654321:role/bitbucket.pipelines"
]
},
"Action": "sts:AssumeRole"
}
]}
图表:
Bitbucket
+-------------+ OpenID Connect +-----------------+
| +-----------------------------> |
| Terraform | | MGMT Account |
| <-----------------------------+ |
+-------------+ Token: bitbucket role +-----------------+
Bitbucket
+-------------+ Execute TF ACM Module +-----------------+
| +-----------------------------> |
| Terraform | | MGMT Account |
| <-----------------------------+ |
+-------------+ Exit Code 0 +-----------------+
Bitbucket
+-------------+ ACM Cont. Execution +-----------------+
| +-----------------------------> |
| Terraform | | PROD Account |
| <-----------------------------+ |
+-------------+ Exit Code 1 +-----------------+
您可以直接使用aws提供程序在Terraform中执行角色扮演。
但如果我理解正确的话,你会对Terraform准备好你的环境后会发生什么更感兴趣,并且你想让你的脚本扮演与Terraform分离的角色。
那么,在我们的第一个角色中,我们从策略中获得哪些权限?从这里开始,没有启用route53:Get等的Action块。在最初建立这些关系时,很难确定您在哪个帐户中执行。用于调试的一个方便的aws-cli命令是:
aws sts get-caller-identity
这将返回有关调用该命令的角色的信息。这将帮助您确保您使用正确的身份(并且使用当前凭据对其进行身份验证(针对区域&要在执行上下文中与之交互的帐户。
如果这没有帮助,请提供错误消息和有关这些位桶脚本/管道正在做什么的更多详细信息。