aws-cdk aws-cli cloudformation 在 arn 中生成额外的字符
aws-cdk aws-cli cloudformation generating extra characters in arn
我正在使用 aws-cdk 创建 cloudformation 模板,实际上只是 SNS 和 SQS。我的问题是生成的主题和队列的名称不是我在 yaml 文件中看到的名称。
这是 CDK 的 TypeScript:
export class TheQThingStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const queue = new sqs.Queue(this, 'ExampleQueue');
const topic = new sns.Topic(this, 'ExampleTopic');
topic.addSubscription(new subs.SqsSubscription(queue));
}
}
生成的 yaml:
Resources:
ExampleQueue4CEF454C:
Type: AWS::SQS::Queue
Metadata:
aws:cdk:path: dev/ExampleQueue/Resource
ExampleQueuePolicy3CE69BA4:
Type: AWS::SQS::QueuePolicy
Properties:
PolicyDocument:
Statement:
- Action: sqs:SendMessage
Condition:
ArnEquals:
aws:SourceArn:
Ref: ExampleTopic65117661
Effect: Allow
Principal:
Service: sns.amazonaws.com
Resource:
Fn::GetAtt:
- ExampleQueue4CEF454C
- Arn
Version: "2012-10-17"
Queues:
- Ref: ExampleQueue4CEF454C
Metadata:
aws:cdk:path: dev/ExampleQueue/Policy/Resource
ExampleQueuedevExampleTopic2BB620969F483AE8:
Type: AWS::SNS::Subscription
Properties:
Protocol: sqs
TopicArn:
Ref: ExampleTopic65117661
Endpoint:
Fn::GetAtt:
- ExampleQueue4CEF454C
- Arn
Metadata:
aws:cdk:path: dev/ExampleQueue/devExampleTopic2BB62096/Resource
ExampleTopic65117661:
Type: AWS::SNS::Topic
Metadata:
aws:cdk:path: dev/ExampleTopic/Resource
CDKMetadata:
Type: AWS::CDK::Metadata
Properties:
Modules: 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-sns-subscriptions=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-info=1.22.0,jsii-runtime=node.js/v12.11.1
如果我 运行 cdk deploy
或 aws cloudformation create-stack dev --template-body file://the-template.yaml
,这些名称会被破坏。
$ aws sqs list-queues {
"QueueUrls": [
"https://region.queue.amazonaws.com/SECRET/dev-ExampleQueue4CEF454C-J3YMCE8ER8LW"
]
}
$ aws sns list-topics
{
"Topics": [
{
"TopicArn": "arn:aws:sns:region:SECRET:dev-ExampleTopic65117661-1HEC7UGNZNT9U"
}
]
}
我知道名称后面的数字是路径的哈希值。 dev-ExampleTopic65117661
-> 65117661
是散列。
1HEC7UGNZNT9U
是从哪里来的?! cloudformation 正在生成它吗?我在代码中的任何地方都找不到它?这个数字是 AWS 提交后创建的吗?为什么?
如果我这样做:
$ aws sqs create-queue --queue-name my-queue
{
"QueueUrls": [
"https://region.queue.amazonaws.com/SECRET/my_queue"
]
}
我没有看到名字末尾的额外数字。是什么赋予了?它必须是 cloudformation 的一部分。
答案:
我接受了下面的答案,这是一个代码示例:
export class TheQThingStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const queue = new sqs.Queue(this, 'ExampleQueue', { queueName: `${id}-ExampleQueue` });
const topic = new sns.Topic(this, 'ExampleTopic', { topicName: `${id}-ExampleTopic` });
topic.addSubscription(new subs.SqsSubscription(queue));
}
}
我以为 ExampleQueue
和 ExampleTopic
是名字。他们是 ID
。如果您传递 name
,它会覆盖其他所有内容。如果您不传递 name
,它会根据您的 ID
、stackId
和哈希构造一个 logicalId
。所以使用名字!
如果您没有为某些内容指定名称,CloudFormation 将根据堆栈名称和资源名称生成一个名称。他们会在它的末尾添加一些额外的内容以确保它是独一无二的。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html
我正在使用 aws-cdk 创建 cloudformation 模板,实际上只是 SNS 和 SQS。我的问题是生成的主题和队列的名称不是我在 yaml 文件中看到的名称。
这是 CDK 的 TypeScript:
export class TheQThingStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const queue = new sqs.Queue(this, 'ExampleQueue');
const topic = new sns.Topic(this, 'ExampleTopic');
topic.addSubscription(new subs.SqsSubscription(queue));
}
}
生成的 yaml:
Resources:
ExampleQueue4CEF454C:
Type: AWS::SQS::Queue
Metadata:
aws:cdk:path: dev/ExampleQueue/Resource
ExampleQueuePolicy3CE69BA4:
Type: AWS::SQS::QueuePolicy
Properties:
PolicyDocument:
Statement:
- Action: sqs:SendMessage
Condition:
ArnEquals:
aws:SourceArn:
Ref: ExampleTopic65117661
Effect: Allow
Principal:
Service: sns.amazonaws.com
Resource:
Fn::GetAtt:
- ExampleQueue4CEF454C
- Arn
Version: "2012-10-17"
Queues:
- Ref: ExampleQueue4CEF454C
Metadata:
aws:cdk:path: dev/ExampleQueue/Policy/Resource
ExampleQueuedevExampleTopic2BB620969F483AE8:
Type: AWS::SNS::Subscription
Properties:
Protocol: sqs
TopicArn:
Ref: ExampleTopic65117661
Endpoint:
Fn::GetAtt:
- ExampleQueue4CEF454C
- Arn
Metadata:
aws:cdk:path: dev/ExampleQueue/devExampleTopic2BB62096/Resource
ExampleTopic65117661:
Type: AWS::SNS::Topic
Metadata:
aws:cdk:path: dev/ExampleTopic/Resource
CDKMetadata:
Type: AWS::CDK::Metadata
Properties:
Modules: 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-sns-subscriptions=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-info=1.22.0,jsii-runtime=node.js/v12.11.1
如果我 运行 cdk deploy
或 aws cloudformation create-stack dev --template-body file://the-template.yaml
,这些名称会被破坏。
$ aws sqs list-queues {
"QueueUrls": [
"https://region.queue.amazonaws.com/SECRET/dev-ExampleQueue4CEF454C-J3YMCE8ER8LW"
]
}
$ aws sns list-topics
{
"Topics": [
{
"TopicArn": "arn:aws:sns:region:SECRET:dev-ExampleTopic65117661-1HEC7UGNZNT9U"
}
]
}
我知道名称后面的数字是路径的哈希值。 dev-ExampleTopic65117661
-> 65117661
是散列。
1HEC7UGNZNT9U
是从哪里来的?! cloudformation 正在生成它吗?我在代码中的任何地方都找不到它?这个数字是 AWS 提交后创建的吗?为什么?
如果我这样做:
$ aws sqs create-queue --queue-name my-queue
{
"QueueUrls": [
"https://region.queue.amazonaws.com/SECRET/my_queue"
]
}
我没有看到名字末尾的额外数字。是什么赋予了?它必须是 cloudformation 的一部分。
答案:
我接受了下面的答案,这是一个代码示例:
export class TheQThingStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const queue = new sqs.Queue(this, 'ExampleQueue', { queueName: `${id}-ExampleQueue` });
const topic = new sns.Topic(this, 'ExampleTopic', { topicName: `${id}-ExampleTopic` });
topic.addSubscription(new subs.SqsSubscription(queue));
}
}
我以为 ExampleQueue
和 ExampleTopic
是名字。他们是 ID
。如果您传递 name
,它会覆盖其他所有内容。如果您不传递 name
,它会根据您的 ID
、stackId
和哈希构造一个 logicalId
。所以使用名字!
如果您没有为某些内容指定名称,CloudFormation 将根据堆栈名称和资源名称生成一个名称。他们会在它的末尾添加一些额外的内容以确保它是独一无二的。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html