我想创建一个云形成模板,该模板使用人类可读的名称创建一个S3存储桶,但是可以自动运行多次。 以下是具有预定义名称的存储桶。
除随机唯一ID外,我该怎么做才能使名称包含人类可读的部分?类似于:MyBucket-abcdabcd
,MyBucket-efghefgh
,MyBucket-ijklijkl
。
"S3Bucket" : {
"Type" : "AWS::S3::Bucket",
"Properties" : {
"BucketName": "MyBucket",
"PublicAccessBlockConfiguration" : {
"BlockPublicAcls" : true,
"BlockPublicPolicy" : true
}
}
}
答案 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 Mattheson 和Sleeper 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 ]]]] }