Amazon web services 自定义资源的云形成功能

Amazon web services 自定义资源的云形成功能,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,我有一个CF模板,在这里我提供了一个参数和一个条件来检查它,以确定如何构造一个bucket名称。如果是prod,则应为“name”。如果不是prod,则应为“name_environment”,如下所示: ############### # # #输入参数# #前缀:t3st-acc0un7-123# #阶段:发展# # # #预期的S3名称输出# #t3st-acc0un7-123-

我有一个CF模板,在这里我提供了一个参数和一个条件来检查它,以确定如何构造一个bucket名称。如果是prod,则应为“name”。如果不是prod,则应为“name_environment”,如下所示:

###############
#                             #
#输入参数#
#前缀:t3st-acc0un7-123#
#阶段:发展#
#                             #
#预期的S3名称输出#
#t3st-acc0un7-123-dev#
#t3st-acc0un7-123-dev-2#
#                             #
# # # # # # # # # # # # # # # #
#                             #
#输入参数#
#前缀:t3st-acc0un7-123#
#阶段:prod#
#                             #
#预期的S3名称输出#
#t3st-acc0un7-123#
#t3st-acc0un7-123-2#
#                             #
# # # # # # # # # # # # # # # #
以下是我的模板,它可以执行以下操作:

参数:
前缀:
类型:字符串
默认值:t3st-acc0un7-123
阶段:
类型:字符串
允许模式:([a-z]|[0-9])+”
条件:
IsProdStage:
Fn::等于:
- !参考阶段
-刺激
资源:
测试桶:
类型:AWS::S3::Bucket
特性:
BucketName:
Fn::如果:
-IsProdStage
- !参考前缀
- !参加
- '-'
- 
- !参考前缀
- !参考阶段
TestBucket2:
类型:AWS::S3::Bucket
特性:
BucketName:
Fn::如果:
-IsProdStage
- !参加
- '-'
-
- !参考前缀
- '2'
- !参加
- '-'
- 
- !参考前缀
- !参考阶段
- '2'
在第一个示例模板中,复制了条件逻辑和连接逻辑。我基本上希望将条件值存储在某个地方,以便从每个后续函数调用,而不是复制逻辑

在下一个示例中,我尝试使用自定义资源调用一个虚拟lambda(因为需要ServiceToken),这样我就可以基于条件和输入在TestCustomResource自定义资源上设置一个,并从我创建的其他资源中读取

参数:
前缀:
类型:字符串
默认值:t3st-acc0un7-123
阶段:
类型:字符串
允许模式:([a-z]|[0-9])+”
条件:
IsProdStage:
Fn::等于:
- !参考阶段
-刺激
资源:
测试桶:
类型:AWS::S3::Bucket
特性:
BucketName:!getatttestcustomresource.Value
TestBucket2:
类型:AWS::S3::Bucket
特性:
BucketName:!参加
- '-'
-
- !getatttestcustomresource.Value
- 2
TestCustomResource:
类型:Custom::Codswallop
特性:
ServiceToken:!格塔特·杜米兰巴达,阿恩
价值:
Fn::如果:
-IsProdStage
- !参考前缀
- !参加
- '-'
- 
- !参考前缀
- !参考阶段
杜米兰巴达:
类型:“AWS::Lambda::Function”
特性:
代码:
ZipFile:>
打印(“”)
处理程序:lambda_函数。lambda_处理程序
角色:!GetAtt DummyRole.Arn
运行时:python3.6
DummyRole:
类型:AWS::IAM::角色
特性:
假设政策文件:
声明:
-效果:允许
负责人:
服务:
-lambda.amazonaws.com
行动:
-sts:假设角色
RoleName:DummyRole
我知道使用虚拟lambda有点麻烦,但这似乎是一个非常有用的功能,能够存储计算出的值,以便在模板周围使用。第二个示例给出了如下错误:TestCustomResource-Custom Resource未能在预期时间内稳定下来


(答案可能是使用依赖于先前CF输出值或嵌套模板的多个模板。)

不要将自定义资源用于伪造目的

操作完成后,该函数需要“回调”到CloudFormation。您的自定义资源没有代码,因此它永远不会回调,因此您的模板永远不会完成

如果你的第一个例子有效,就坚持下去。您的第二个选择(除了不工作之外)对于未来的IT人员来说很难理解和维护


在未来的维护中,一定要比优雅的黑客更容易。(由一位不得不维护他人优雅黑客技能的人发言。)

说得好,但为了澄清定制资源并非用于虚假目的,它集中了条件逻辑和bucket名称构造,因此其他资源不必重复逻辑。除了结果是下一个人要理解的长度和复杂性的两倍之外。(而且不起作用。)相反,只需使用
之类的语法简化您的第一个版本!子'arn:aws:ec2:${aws::Region}:${aws::AccountId}:vpc/${vpc}'
避免了加入
的需要。