【问题标题】:aws-cdk aws-cli cloudformation generating extra characters in arnaws-cdk aws-cli cloudformation 在 arn 中生成额外的字符
【发布时间】:2020-01-29 11:33:37
【问题描述】:

我正在使用 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 deployaws 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));
  }
}

我以为ExampleQueueExampleTopic 是名字。他们是IDs。如果您传递name,它将覆盖其他所有内容。如果您不传递name,它会从您的IDstackId 和一个哈希中构造一个logicalId。所以用名字吧!

【问题讨论】:

    标签: amazon-cloudformation aws-cli aws-cdk


    【解决方案1】:

    如果您没有为某些内容指定名称,CloudFormation 将根据堆栈名称和资源名称生成一个名称。他们会在结尾添加一些额外内容,以确保它是独一无二的。

    https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html

    【讨论】:

    • 为什么每次指定一个队列时不需要名称?
    • 完全可以!只是浪费了 3 天的时间,因为它不在 CDK 文档中的任何位置。但是请注意,您必须将堆栈 ID 传递到名称中,除非您希望您的名称发生冲突。
    • 不确定您的意思,但是当您在堆栈中引用队列时,它使用 Fn::Ref (!Ref) 或 Fn::GetAtt (!GetAtt) 函数来解决全名/ARN。
    • 我意识到当我执行aws sqs create-queue --queue-name whatever 时,它会创建带有名称的队列,它就在文本中。但是当我使用 CDK 时,我认为是“名称”实际上是“id”并且名称会生成。我觉得这很令人困惑。 :)
    猜你喜欢
    • 2018-11-13
    • 2020-03-13
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2019-03-14
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多