AWS CDK:无法找到使用子进程创建的 IAM 角色
AWS CDK : Unable to find IAM Role created using subprocess
我使用 iam.Role 创建了一个角色,然后尝试使用子进程库找到该角色。我看到角色创建成功,但无法在使用子进程执行的命令的输出中找到角色。请在下面找到代码。
任何人都可以指出问题所在,并建议根据 CDK
中的角色 name/Id 获得任何角色的 Arn 的最佳方法是什么
class CdkTestStack(堆栈):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
#Create role
role = iam.Role(self, role_name='cdk-test-role',
id='cdk-test-role',
assumed_by=iam.CompositePrincipal(iam.ServicePrincipal('lambda.amazonaws.com')),
max_session_duration=aws_cdk.Duration.seconds(10000),
path='/test-cdk/')
print('Created role with name: '+str(role.role_name))
#Get list of all policies
roles_output=subprocess.run(['aws', 'iam', 'list-roles', '--path-prefix', '/test-cdk/'], capture_output=True, text=True)
roles = str(roles_output.stdout)
roles_cli = json.loads(roles)
for roles_cli_key in roles_cli:
roles_arr = roles_cli[roles_cli_key]
for rol in roles_arr:
rol_nam = rol['RoleName']
if(rol_nam == 'cdk-test-role'):
role_id = rol['RoleId']
role_arn = rol['Arn']
imported_role = iam.Role.from_role_arn(id=role_id,scope=self,role_arn=role_arn)
print('Found imported role: '+str(imported_role.role_name))
您可以使用 CDK 输出按名称从堆栈中获取角色 arn。
https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_core.CfnOutput.html
CDK 生成 CloudFormation 模板。因此,当 CLI 运行您的代码时,结果是一个模板。只有当此模板上传到 AWS 并执行时才会创建您的角色(cdk deploy
这样做)。
此外,从您的 CDK 代码进行网络调用,尤其是 SDK 调用不是一个好主意。最佳实践是使您的 CDK 代码具有确定性 - 即每次合成相同的模板而不依赖于网络。
我使用 iam.Role 创建了一个角色,然后尝试使用子进程库找到该角色。我看到角色创建成功,但无法在使用子进程执行的命令的输出中找到角色。请在下面找到代码。
任何人都可以指出问题所在,并建议根据 CDK
中的角色 name/Id 获得任何角色的 Arn 的最佳方法是什么class CdkTestStack(堆栈):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
#Create role
role = iam.Role(self, role_name='cdk-test-role',
id='cdk-test-role',
assumed_by=iam.CompositePrincipal(iam.ServicePrincipal('lambda.amazonaws.com')),
max_session_duration=aws_cdk.Duration.seconds(10000),
path='/test-cdk/')
print('Created role with name: '+str(role.role_name))
#Get list of all policies
roles_output=subprocess.run(['aws', 'iam', 'list-roles', '--path-prefix', '/test-cdk/'], capture_output=True, text=True)
roles = str(roles_output.stdout)
roles_cli = json.loads(roles)
for roles_cli_key in roles_cli:
roles_arr = roles_cli[roles_cli_key]
for rol in roles_arr:
rol_nam = rol['RoleName']
if(rol_nam == 'cdk-test-role'):
role_id = rol['RoleId']
role_arn = rol['Arn']
imported_role = iam.Role.from_role_arn(id=role_id,scope=self,role_arn=role_arn)
print('Found imported role: '+str(imported_role.role_name))
您可以使用 CDK 输出按名称从堆栈中获取角色 arn。
https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_core.CfnOutput.html
CDK 生成 CloudFormation 模板。因此,当 CLI 运行您的代码时,结果是一个模板。只有当此模板上传到 AWS 并执行时才会创建您的角色(cdk deploy
这样做)。
此外,从您的 CDK 代码进行网络调用,尤其是 SDK 调用不是一个好主意。最佳实践是使您的 CDK 代码具有确定性 - 即每次合成相同的模板而不依赖于网络。