您能否以编程方式获取 cdk 资源的 ARN 或物理名称?
Can you fetch the ARN or physical names of cdk resources programmatically?
即
my_project.my_stack.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_name'
当 aws-cdk
实例化表示资源的 class 时,它不一定已部署。 s3_bucket.bucket_name
的值是一个token,表示bucket name字符串,供其他cloudformation资源引用。部署后在非 cdk 应用程序中获取存储桶名称的最佳方法是将该值存储在可从您的应用程序访问的某个位置。
这可能是使用 CfnOutput
或 SSM 参数的 cloudformation 输出值。你可以这样做:
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 中获取参数值。或者您可以静态命名存储桶并引用存储桶名称字符串而不是参数名称。
能够在应用程序运行时透明地引用资源的想法已经过试验,punchcard 是最著名的例子,但现在构建标记化的值只能在上下文中理解CDK 应用程序。
即
my_project.my_stack.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_name'
当 aws-cdk
实例化表示资源的 class 时,它不一定已部署。 s3_bucket.bucket_name
的值是一个token,表示bucket name字符串,供其他cloudformation资源引用。部署后在非 cdk 应用程序中获取存储桶名称的最佳方法是将该值存储在可从您的应用程序访问的某个位置。
这可能是使用 CfnOutput
或 SSM 参数的 cloudformation 输出值。你可以这样做:
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 中获取参数值。或者您可以静态命名存储桶并引用存储桶名称字符串而不是参数名称。
能够在应用程序运行时透明地引用资源的想法已经过试验,punchcard 是最著名的例子,但现在构建标记化的值只能在上下文中理解CDK 应用程序。