您能否以编程方式获取cdk资源的ARN或物理名称?

2024-04-27 00:54:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我的项目.我的堆栈.py

from aws_cdk import core
from aws_cdk.aws_s3 import Bucket


class MyStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        self.s3_bucket = Bucket(self, "s3-bucket-id")

app.py

from aws_cdk import core

from my_project.my_stack import MyStack

app = core.App()
my_stack = MyStack(app, "my-stack")

app.synth()

if __name__ == "__main__":
    import boto3
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(my_stack.s3_bucket.bucket_name)
    # ^ raises -- AttributeError: 's3.ServiceResource' object has no attribute 'bucket_name'

运行python app.py将引发AttributeError:'s3.ServiceResource'对象没有属性'bucket\u name'


Tags: namefrompycoreimportselfawsapp
1条回答
网友
1楼 · 发布于 2024-04-27 00:54:00

aws-cdk实例化一个表示资源的类时,它不一定是已部署的。s3_bucket.bucket_name的值是一个令牌,表示在其他cloudformation资源中引用的bucket名称字符串。部署非cdk应用程序后,在该应用程序中获取bucket名称的最佳方法是将该值存储在可从应用程序访问的位置

这可以是使用^{}的cloudformation输出值或SSM参数。你可以这样做:

from aws_cdk import core
from aws_cdk.aws_s3 import Bucket
from aws_cdk.aws_ssm import StringParameter


class MyStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)
        self.s3_bucket_name_param_name = "my-parameter-name"
        self.s3_bucket = Bucket(self, "s3-bucket-id")
        StringParameter(self, "s3-bucket-name-param",
            parameter_name=self.s3_bucket_name_param,
            string_value=self.s3_bucket.bucket_name)

然后从ssm获取参数值。或者您可以静态地命名bucket,并引用bucket name字符串而不是参数名

在应用程序运行时能够透明地引用这样的资源的想法已经被实验过,punchcard是最显著的例子,但是现在构造标记化的值只在CDK应用程序的上下文中被理解

相关问题 更多 >