【问题标题】:Create instanceprofile with CDK and Python使用 CDK 和 Python 创建实例配置文件
【发布时间】:2021-09-28 08:35:15
【问题描述】:

我是 cdk 新手,并尝试使用以下代码使用 CDK+Python 创建实例配置文件。我已经通过 CDK 成功创建了角色(gitLabRunner-glue),并希望将它与实例配置文件一起使用。但是,当我运行以下代码时,出现错误gitLabRunner-glue already exists

有人可以解释一下我错过了什么吗?

from aws_cdk import core as cdk
from aws_cdk import aws_glue as glue
from aws_cdk import aws_ec2 as _ec2
from aws_cdk import aws_iam as _iam

class Ec2InstanceProfile(cdk.Stack):
    def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # role = _iam.Role(self, "instanceprofilerole", role_name="gitLabRunner-glue",
        #              assumed_by=_iam.ServicePrincipal(service='ec2.amazonaws.com'))


        ec2gitLabRunnerinstanceprofile = _iam.CfnInstanceProfile(
            self,
            "ec2gitLabRunnerinstanceprofile",
            instance_profile_name="ec2-gitLabRunner-glue",
            roles=["gitLabRunner-glue"] # also tried with this[role.role_name]
    )

【问题讨论】:

    标签: python amazon-ec2 amazon-cloudformation amazon-iam aws-cdk


    【解决方案1】:

    您的 AWS 账户中是否已有使用该名称的角色?

    cdk 中的 Cfn 函数表示尚未完全连接到所有 CDK 的构造和服务。因此,他们通常不会做其他人会做的事情 - 作为实例配置文件的 CloudFormation 模板可能只是挂钩到现有角色,此 cfn 函数后面的编码可能会继续并在模板输出。

    如果您使用 cdk 合成器,请查看您的 cdk.out 目录,找到您的 cloudformation 模板,然后搜索 gitLabRunner-glue - 您可能会发现正在创建一个 AWS::IAM::ROLE,指示何时CloudFormation 尝试基于 cdk 创建的模板运行它尝试创建一个新资源但它不能。

    您有几个选择可以尝试:

    1. 正如您所尝试的,再次取消注释角色并使用 role.role_name 但将角色命名为其他名称,或者按照 CDK 的建议,不要包含名称并让它为您命名

    2. 在您的 aws 帐户中搜索该角色并将其删除

    3. 如果您绝对无法删除现有角色或无法使用新名称创建新角色,则使用(基于您的导入)导入该角色

      role = _iam.Role.from_role_arn(self, "ImportedGlueRole", role_arn="arn:aws:of:the:role", add_grants_to_resources=True)

    对 add_grants_to_resources 保持警惕 - 如果不是你的角色来弄乱 cdk 可以进行更改,如果你做到这一点并且这可能会导致其他地方出现问题 - 但如果它不是真的,那么你必须更新角色本身aws 控制台(或 cli)接受您的资源作为能够承担它。

    【讨论】:

    • 是的,我的帐户中已有该角色。我们正在使用 ALZ 并且必须遵循一定的命名约定来启动资源。因此,我不能让 cdk 在后台使用自己的命名约定创建实例配置文件。我也无法在上面的代码中将现有角色用作字符串。所以我最终删除了现有角色并在同一代码块中创建了实例配置文件和角色。但是,所需的设计是将该角色作为单独的类单独创建,然后在实例配置文件类中将其作为现有角色引用。
    • 这仍然是可能的,您只需要链接两个堆栈。您可以将角色设置为堆栈中的自变量并在外部引用它 - 甚至可以将其传递到另一个堆栈(尽管我会将两个堆栈都设为 NestedStacks 并将它们放在整个应用程序的第三个公共堆栈中 - 引用当一个堆栈无法更新时,顶层(非嵌套)堆栈之间的堆栈构造可能会导致部署困难,因为它会影响另一个堆栈。
    • 您介意分享一个工作示例吗,因为,我记得我也尝试过这种方法,但它对我不起作用。也许,我错过了什么……TIA
    • 我在公共 git 上没有任何东西,因为我的 cdk 工作都在我的公司企业 git 上,但作为一个快速...imgur.com/a/o6r4gDS 类似的东西你仍然需要 ahve除了创建它的 CDK 堆栈或使用 iam.Role.from_attributes 或 from_arn 之前未创建的角色
    【解决方案2】:

    我让它像这样工作,虽然不是想要的模型,但鉴于 cdk 的限制,我找不到任何其他方法。

    from aws_cdk import core as cdk
    from aws_cdk import aws_glue as glue
    from aws_cdk import aws_ec2 as _ec2
    from aws_cdk import aws_iam as _iam
    
    class Ec2InstanceProfile(cdk.Stack):
        def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
            super().__init__(scope, construct_id, **kwargs)
            boundary = _iam.ManagedPolicy.from_managed_policy_arn(self, "Boundary",
                                                               "arn:aws:iam::${ACCOUNT_ID}:policy/app-perm-boundary")
    
            # role = _iam.Role(self, "instanceprofilerole", role_name="gitLabRunner-glue",
            #              assumed_by=_iam.ServicePrincipal(service='ec2.amazonaws.com'))
    
            ec2_gitlabrunner_glue = _iam.Role(
                self, 'ec2-gitlabrunner-glue',
                role_name='gitLabRunner-glue',
                description='glue service role to be attached to the runner',
                # inline_policies=[write_to_s3_policy],
                assumed_by=_iam.ServicePrincipal('ec2.amazonaws.com'),
                permissions_boundary=boundary
            )
    
            ec2gitLabRunnerinstanceprofile = _iam.CfnInstanceProfile(
                self,
                "gitLabRunnerinstanceprofile",
                instance_profile_name="gitLabRunner-glue",
                roles=["gitLabRunner-glue"]
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 2022-06-10
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2016-10-01
      相关资源
      最近更新 更多