![](/img/trans.png)
[英]Is there a way to connect a new lambda function an existing AWS ApiGateway using AWS-CDK? (Python)
[英]How to add an existing resource to stack using Python AWS-CDK?
我尝试使用以下定义进行部署,但得到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 的正确步骤是什么?
您可以使用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
]) – 是否可以通过附加策略资源来修改导入的角色。 默认值:真
所以我不确定它是否适合你。
根本原因:您创建了堆栈,但您提取了它之外的角色,因此它是“孤立的”,AWS CDK 应用程序无法理解它应该用它做什么。
这个问题应该分三步解决(自下而上的方法):
我正在使用 CDK v2。
0.1. 项目结构
.
├── app.py
├── cdk.json
├── requirements.txt
├── .gitignore
└── stacks
├── stack.py
└── __init__.py
这是一个基本的项目结构,允许您与 AWS CDK 进行交互。
0.2. 要求.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 中运行。
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 列出了我们的所有资源(新的或已经存在的)。 下面给出了链接以查看所有可用选项。
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 应用程序并创建我们之前构建的类的实例。
$cdk ls
$cdk synth
$cdk deploy stack-name-to-be-displayed-in-cloudformation
在部署之前,强烈建议运行cdk ls
、 cdk synth
、 cdk diff
以查看是否一切正常。
如果我可以帮助您更多,请告诉我。 希望你觉得它有用。 干杯!
参考文档等:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.