Amazon cloudformation aws cdk aws cli cloudformation在arn中生成额外字符

Amazon cloudformation aws cdk aws cli cloudformation在arn中生成额外字符,amazon-cloudformation,aws-cli,aws-cdk,Amazon Cloudformation,Aws Cli,Aws Cdk,我正在使用AWSCDK创建云信息模板,实际上只是SNS和SQS。我的问题是,生成的主题和队列的名称与我在yaml文件中看到的不同 以下是CDK的类型脚本: 导出类qthingstack扩展了cdk.Stack{ 构造函数(作用域:cdk.App,id:string,props?:cdk.StackProps){ 超级(范围、id、道具); const queue=new sqs.queue(这是“ExampleQueue”); const topic=新的sns.topic(这是“Example

我正在使用AWSCDK创建云信息模板,实际上只是SNS和SQS。我的问题是,生成的主题和队列的名称与我在yaml文件中看到的不同

以下是CDK的类型脚本:

导出类qthingstack扩展了cdk.Stack{
构造函数(作用域:cdk.App,id:string,props?:cdk.StackProps){
超级(范围、id、道具);
const queue=new sqs.queue(这是“ExampleQueue”);
const topic=新的sns.topic(这是“ExampleTopic”);
topic.addSubscription(新subs.sqsssubscription(queue));
}
}
生成的yaml:

资源:
示例Queue4CEF454C:
类型:AWS::SQS::队列
元数据:
aws:cdk:path:dev/ExampleQueue/Resource
示例QueuePolicy3Ce69BA4:
类型:AWS::SQS::QueuePolicy
特性:
政策文件:
声明:
-操作:sqs:SendMessage
条件:
ArnEquals:
aws:SourceArn:
参考:示例主题65117661
效果:允许
负责人:
服务:sns.amazonaws.com
资源:
Fn::GetAtt:
-示例Queue4CEF454C
-阿恩
版本:“2012-10-17”
队列:
-参考:示例Queue4CEF454C
元数据:
aws:cdk:path:dev/ExampleQueue/Policy/Resource
示例QueueDevExampleTopic2BB620969F483AE8:
类型:AWS::SNS::订阅
特性:
协议:sqs
TopicArn:
参考:示例主题65117661
终点:
Fn::GetAtt:
-示例Queue4CEF454C
-阿恩
元数据:
aws:cdk:path:dev/ExampleQueue/devExampleTopic2BB62096/Resource
示例主题65117661:
类型:AWS::SNS::Topic
元数据:
aws:cdk:path:dev/ExampleTopic/Resource
CDKMetadata:
类型:AWS::CDK::元数据
特性:
模块:aws cdk=1.22.0、@aws cdk/aws cloudwatch=1.22.0、@aws cdk/aws iam=1.22.0、@aws cdk/aws kms=1.22.0、@aws cdk/aws sns=1.22.0、@aws cdk/aws sqs=1.22.0、@aws cdk/core=1.22.0、@aws cdk/cx api=1.22.0、@aws cdk/region=1.22.0、jsii运行时节点V111.1
如果我运行
cdk deploy
aws cloudformation创建堆栈开发——模板体file://the-template.yaml
,这些名字会被弄乱

$aws sqs列表队列{
“队列URL”:[
"https://region.queue.amazonaws.com/SECRET/dev-ExampleQueue4CEF454C-J3YMCE8ER8LW"
]
}
$aws sns列表主题
{
“主题”:[
{
“TopicArn”:“arn:aws:sns:region:SECRET:dev-ExampleTopic65117661-1HEC7UGNZNT9U”
}
]
}
我知道名字后面的数字是路径的散列
dev-ExampleTopic65117661
->
65117661
是散列

1HEC7UGNZNT9U
从哪里来?!是云层生成的吗?我在代码里的任何地方都找不到?这个数字是AWS提交后创建的吗?为什么?

如果我这样做:

$aws sqs创建队列--队列名称我的队列
{
“队列URL”:[
"https://region.queue.amazonaws.com/SECRET/my_queue"
]
}
我没有在名字后面加额外的数字。有什么好处?这一定是云层形成的一部分

回答:

我接受了下面的答案,下面是一个代码示例:

导出类qthingstack扩展了cdk.Stack{
构造函数(作用域:cdk.App,id:string,props?:cdk.StackProps){
超级(范围、id、道具);
const queue=new sqs.queue(这个'ExampleQueue',{queueName:`${id}-ExampleQueue`});
const topic=new sns.topic(这个'ExampleTopic',{topicName:`${id}-ExampleTopic`});
topic.addSubscription(新subs.sqsssubscription(queue));
}
}

我以为
ExampleQueue
ExampleTopic
是名字。它们是
ID
s。如果您传递一个
名称
,它将覆盖所有其他内容。如果您没有传递
名称
,它将从
ID
堆栈ID
和散列中构造一个
logicalId
。所以用名字吧

如果不为某个对象指定名称,CloudFormation将根据堆栈名称和资源名称生成名称。他们会在它的末尾添加一些额外的内容,以确保它的独特性


如果不为某个对象指定名称,CloudFormation将根据堆栈名称和资源名称生成名称。他们会在它的末尾添加一些额外的内容,以确保它的独特性


当我一次指定一个队列时,为什么它不需要名称?尽管如此,它完全可以工作!在这上面浪费了3天,因为它不在CDK文档中的任何地方。请注意,除非您希望名称发生冲突,否则您必须将堆栈id传递到名称中。不确定您的确切意思,但当您引用堆栈中的队列时,它使用的是Fn::Ref(!Ref)或Fn::GetAtt(!GetAtt)函数来解析全名/ARN。我意识到,当我执行
aws sqs创建队列--queue name which
时,它会创建带有名称的队列,它就在文本中。但是当我使用CDK时,我认为“名称”实际上是“id”,并且名称被生成。我觉得这令人困惑当我一次只指定一个队列时,为什么它不需要名称呢?不过完全可以!在这上面浪费了3天,因为它不在CDK文档中的任何地方。不过请注意,除非您希望名称发生冲突,否则您必须将堆栈id传递到名称中。不确定您的确切意思,但当您引用堆栈中的队列时,它正在使用Fn::Ref(!Ref)或Fn::GetAtt(!GetAtt)函数解析全名/ARN。当我执行
aws sqs时,我意识到了这一点