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

时间:2019-02-27 03:14:30

标签: amazon-s3 amazon-cloudformation

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

除随机唯一ID外,我该怎么做才能使名称包含人类可读的部分?类似于:MyBucket-abcdabcdMyBucket-efghefghMyBucket-ijklijkl

"S3Bucket" : {
  "Type" : "AWS::S3::Bucket",
  "Properties" : {
    "BucketName": "MyBucket",
    "PublicAccessBlockConfiguration" : {
      "BlockPublicAcls" : true,
      "BlockPublicPolicy" : true
    }
  }
}

4 个答案:

答案 0 :(得分:0)

您有两个选择。

第一个选项-您可以将BucketName属性保留为空白。当您将其留空时,它将产生一个名称: <堆栈名称>-<模板逻辑名称>-<随机后缀>

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

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

!Select [1, !Split [/, !Ref AWS::StackId ]]

那将产生'51af3dc0-da77-11e4-872e-1234567db123' 您可以再次将其拆分,然后根据需要选择一部分。

!Select [1, !Split[-, !Select [1, !Split [/, !Ref AWS::StackId ]]]]

给您51af3dc0

答案 1 :(得分:0)

感谢Sleeper Smith。这是一个很好的答案,一段时间以来我一直在寻找解决方案!


tl; dr

下面的Yaml CloudFormation返回“带有半随机名称的存储桶-51af3dc0”

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>

<button id="button"> Click me </button>

<div class="content">

</div>

代码示例provided Sleeper Smith中的轻微索引错误。您将需要按以下方式替换选择索引。

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

BucketWithSemiRandomName:
  Type: "AWS::S3::Bucket"
  Properties:
    BucketName: !Join
      - "-"
      - - "bucket-with-semi-random-name"
        - !Select
          - 0
          - !Split
            - "-"
            - !Select
              - 2
              - !Split
                - "/"
                - !Ref "AWS::StackId"
arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123

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

!Select [2, !Split [/, !Ref AWS::StackId ]]

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


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

!Select [0, !Split[-, !Select [2, !Split [/, !Ref AWS::StackId ]]]]

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

答案 2 :(得分:0)

另一种方式可能是:

Resources:
    MyBucket:
      Type: "AWS::S3::Bucket"
Outputs:
  S3Bucket2:
    Description: "My Bucket" 
    Value: !Ref 'MyBucket'

答案 3 :(得分:0)

感谢Phillip MatthesonSleeper Smith 的出色回答!我想提供一种替代(并且更容易阅读恕我直言)方法来产生相同的结果。我更喜欢尽可能使用 !Sub 而不是 !Join(有关详细信息,请参阅 this great blog post):

  BucketWithSemiRandomName:
    Type: AWS::S3::Bucket
    Properties:
      BucketName:
        !Sub
          - 'bucket-with-semi-random-name-${RandomGUID}'
          - { RandomGUID: !Select [0, !Split ["-", !Select [2, !Split ["/", !Ref AWS::StackId ]]]] }