如何使用云形成为 S3 存储桶设置半随机名称

Yas*_*son 9 amazon-s3 aws-cloudformation

我想创建一个云形成模板,该模板创建一个具有人类可读名称的 S3 存储桶,但可以自动运行多次。下面是一个带有预定义名称的存储桶。

除了随机的唯一 id 之外,我还能做些什么来使名称包含人类可读的部分?类似的东西:MyBucket-abcdabcd, MyBucket-efghefgh, MyBucket-ijklijkl

"S3Bucket" : {
  "Type" : "AWS::S3::Bucket",
  "Properties" : {
    "BucketName": "MyBucket",
    "PublicAccessBlockConfiguration" : {
      "BlockPublicAcls" : true,
      "BlockPublicPolicy" : true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*son 15

谢谢沉睡者史密斯。这是一个很好的答案,我一直在寻找解决方案有一段时间了!


tl;博士

下面的 yaml CloudFormation 返回“bucket-with-semi-random-name-51af3dc0”

BucketWithSemiRandomName:
  Type: "AWS::S3::Bucket"
  Properties:
    BucketName: !Join
      - "-"
      - - "bucket-with-semi-random-name"
        - !Select
          - 0
          - !Split
            - "-"
            - !Select
              - 2
              - !Split
                - "/"
                - !Ref "AWS::StackId"
Run Code Online (Sandbox Code Playgroud)

Sleeper Smith 提供的代码示例中存在轻微的索引错误。您将需要替换选择索引,如下所示。

使用相同的示例堆栈 ARN 作为原始答案...

arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123
Run Code Online (Sandbox Code Playgroud)
!Select [2, !Split [/, !Ref AWS::StackId ]]
Run Code Online (Sandbox Code Playgroud)

上面的代码示例从 Stack ARN "51af3dc0-da77-11e4-872e-1234567db123" 返回 UUID(索引 2)

!Select [0, !Split[-, !Select [2, !Split [/, !Ref AWS::StackId ]]]]
Run Code Online (Sandbox Code Playgroud)

上面的代码示例从堆栈 ARN "51af3dc0" 返回 UUID 的第一段(索引 0)


这是我现在根据Sleeper Smith 的回答使用的结果 yaml 。我结合了一个 !Join 来为存储桶名称提供更多上下文。

BucketWithSemiRandomName:
  Type: "AWS::S3::Bucket"
  Properties:
    BucketName: !Join
      - "-"
      - - "bucket-with-semi-random-name"
        - !Select
          - 0
          - !Split
            - "-"
            - !Select
              - 2
              - !Split
                - "/"
                - !Ref "AWS::StackId"
Run Code Online (Sandbox Code Playgroud)

以上代码示例返回“bucket-with-semi-random-name-51af3dc0”


Sle*_*ith 5

你有两个选择。

第一个选项 - 您可以将 BucketName 属性留空。当你把它留空时,它会产生一个名称:<stackname>-<template logical name>-<random suffix>

因此,如果您有有意义的堆栈名称和模板逻辑名称,它应该每次都为您提供一个唯一的存储桶名称。

第二个选项 - 使用 Stack ARN 后缀,它是一个随机 guid:arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123

!Select [2, !Split [/, !Ref AWS::StackId ]]
Run Code Online (Sandbox Code Playgroud)

这将产生 '51af3dc0-da77-11e4-872e-1234567db123' 您可以进一步拆分它并根据需要选择一部分。

!Select [0, !Split[-, !Select [2, !Split [/, !Ref AWS::StackId ]]]]
Run Code Online (Sandbox Code Playgroud)

给你 51af3dc0