【问题标题】:How to add an existing resource to stack using Python AWS-CDK?如何使用 Python AWS-CDK 将现有资源添加到堆栈?
【发布时间】:2021-07-28 17:05:10
【问题描述】:

我尝试使用以下定义进行部署,但收到 ExampleRole already exists 错误。

from aws_cdk import aws_iam as iam
from aws_cdk import core

app = core.App()
stack = core.Stack(app, "MyStack")

existing_role = iam.Role(
    stack,
    id="ExampleRole",
    assumed_by=iam.AccountPrincipal(123456789),
    role_name="ExampleRole",
)
existing_role.apply_removal_policy(core.RemovalPolicy.RETAIN)

app.synth()

仅使用 CDK 的正确步骤是什么?

【问题讨论】:

  • 注意:最好使用from aws_cdk import core as cdk 并使用cdk 变量而不是core

标签: python aws-cdk


【解决方案1】:

您可以使用iam.Role.from_role_arn() 通过 ARN 导入现有的 IAM 角色;

existing_role = iam.Role.from_role_arn(
    stack,
    id="ExampleRole",
    role_arn="arn:aws:iam::123456789012:role/......",
)
existing_role.apply_removal_policy(core.RemovalPolicy.RETAIN)

我见过像 SQS from_queue_arn() 和类似的函数返回对资源的只读引用的情况,因此您实际上无法使用 CDK 代码对其进行修改;但是,from_role_arn 有一个 mutable=True 参数,它说

mutable (Optional[bool]) - 是否可以通过附加策略资源来修改导入的角色。默认值:真

所以我不确定它是否适合你。

【讨论】:

  • 谢谢,我会努力的!
  • 不幸的是,它没有将角色添加到堆栈中。
  • 另外,由于Cannot apply RemovalPolicy: no child or not a CfnResource. Apply the removal policy on the CfnResource directly.,我无法应用删除政策
  • 好吧,那么我建议在他们的 repo 上打开一个问题:github.com/aws/aws-cdk。该工具非常新,他们每周都会进行重大更改,并且他们非常擅长响应问题,因此您可能会在那里获得支持。如果你这样做了,记得在这里为未来的读者发帖;)
【解决方案2】:

根本原因:您创建了堆栈,但您在堆栈之外获取了角色,因此它是“孤儿”,AWS CDK 应用程序无法理解它应该如何处理。

这个问题应该分三个步骤来解决(自下而上的方法):

  • 项目结构
  • stack.py
  • app.py
  • 部署

我正在使用 CDK v2。

0.1。 项目结构

.
├── app.py
├── cdk.json
├── requirements.txt
├── .gitignore
└── stacks
    ├── stack.py
    └── __init__.py

这是一个基本项目结构,可让您与 AWS CDK 进行交互。

0.2。 requirements.txt

# CDK v2 update: npm install -g aws-cdk@next

aws-cdk-lib==2.0.0-rc.14
boto3

我添加了 requirements.txt 的内容只是为了确保我们在同一页面上。此外,最好将您的 AWS CDK npm 更新为最新版本。这个命令应该在cmd中运行。

  1. stack.py
import aws_cdk as cdk
from aws_cdk import aws_iam as _iam


class MyNewStack(cdk.Stack):

    def __init__(self, scope, construct_id, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Fetch existing resources
        role = _iam.Role.from_role_arn(self, "my_existing_role",
                                       role_arn="role_arn_copied_from_webui_as-string", 
                                       mutable=False)

在这里,我们创建了一个堆栈,其中列出了使用 CDK API 的所有资源(新的或现有的)。下面给出了链接以查看所有可用选项。

  1. app.py
from stacks.Stack import *

# Initializing the CDK app
app = cdk.App()
env = cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION'))

# Stacks
MyNewStack(app, "stack-name-to-be-displayed-in-cloudformation", env=env)

# Required to get files updated in cdk.out
app.synth()

这里我们初始化 CDK 应用并创建我们之前构建的类的实例。

  1. 部署
$cdk ls
$cdk synth
$cdk deploy stack-name-to-be-displayed-in-cloudformation

部署前,强烈建议运行cdk lscdk synthcdk diff,看看是否一切正常。

请让我知道,以防我可以为您提供更多帮助。希望你觉得它有用。干杯!

参考文档等:

  1. CDK 简介:https://docs.aws.amazon.com/cdk/latest/guide/home.html
  2. CDK API 参考:https://docs.aws.amazon.com/cdk/api/v2/python/modules.html
  3. 构建项目的更好方法:https://www.sentiatechblog.com/aws-cdk-structure-components
  4. CDK 模式(实际示例):https://cdkpatterns.com/

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2020-10-29
    • 2020-12-19
    • 2021-06-19
    • 2019-06-22
    • 1970-01-01
    • 2023-01-24
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多