在AWS Organizations新建账号创建资源报错:Assume Role: role ARN not set
问题:Pulumi创建AWS组织账号后跨账号创建IAM用户失败
我尝试采用类似策略,用Python(借助Output.concat)通过Pulumi创建AWS组织账号,并在新账号内创建IAM用户,代码如下:
import pulumi import pulumi_aws as aws stack = pulumi.get_stack() account = aws.organizations.Account( f"{stack}-account", email="master@example.com", role_name=f"{stack}-account-role", ) provider = aws.Provider( f"{stack}-account-provider", assume_role={'role_arn': pulumi.Output.concat("arn:aws:iam::", account.id, ":role/", account.role_name)}, ) aws.iam.User("new-iam-user", path='/', opts=pulumi.ResourceOptions(provider=provider))
我在根账号中创建了拥有管理员权限的IAM用户,使用该用户凭证执行pulumi up时,遇到如下错误:
Diagnostics: aws:iam:User (new-iam-user): error: unable to validate AWS credentials. Details: Assume Role: role ARN not set Make sure you have: • Set your AWS region, e.g. `pulumi config set aws:region us-west-2` • Configured your AWS credentials as per https://pulumi.io/install/aws.html You can also set these via cli using `aws configure`.
我查看了role_name属性文档,认为逻辑可行,但始终报错,请问问题出在哪?
解决方案
问题出在Pulumi Output值的异步处理上,直接在assume_role字典中使用Output.concat无法让Pulumi正确识别依赖顺序,导致构建角色ARN时account.id还未生成,进而报错角色ARN未设置。
修改代码,用apply方法来构建assume_role配置,确保只有在account.id可用后才生成完整的角色ARN:
import pulumi import pulumi_aws as aws stack = pulumi.get_stack() account = aws.organizations.Account( f"{stack}-account", email="master@example.com", role_name=f"{stack}-account-role", ) # 通过apply异步构建assume_role配置 provider = aws.Provider( f"{stack}-account-provider", assume_role=account.id.apply(lambda acc_id: { 'role_arn': f"arn:aws:iam::{acc_id}:role/{account.role_name}" }), ) aws.iam.User("new-iam-user", path='/', opts=pulumi.ResourceOptions(provider=provider))
额外注意事项
- 确保根账号的IAM用户拥有创建AWS组织账号以及假定新账号目标角色的权限(AWS组织创建账号时默认会在新账号生成指定role_name的角色,并允许管理账号假定,但需确认无权限拦截)
- 已正确配置AWS区域,可通过命令
pulumi config set aws:region <你的区域>设置
内容的提问来源于stack exchange,提问作者Peterhack
相关产品推荐
相关产品推荐

