在资源编排ROS我想同时创建,F1,F2,F3,其中F1的参数在界面上填,F2,F3都复制F1的不用手填;这个场景推荐的做法是什么呢?我之前想的就是Fn::GetAtt [F1 InstanceType]。
如果您需要同时创建多个函数资源,其中某些函数资源的参数需要手工填写,而另外的函数资源则可以直接复制其他已经定义好的函数资源,那么您可以考虑使用 ROS 的参数化部署(Parameterized Deployment)来实现。
具体来说,您可以将 F1 的参数定义为模板化参数,然后通过在模板对应的参数文件中指定该参数的值来启动相应的部署任务。而对于 F2 和 F3,您可以使用 ROS Support Client 的 capabilities.renameStack API 来复制 F1 的函数部分,并修改其 FunctionName 等属性以创建新的函数资源。
以下是一个创建函数资源的 YAML 示例文件,其中包含了一个模板化参数 FunctionConfig,以及一个复制函数资源的 ROS Support Client API 调用示例:
ROSTemplateFormatVersion: "2015-09-01"
Parameters:
FunctionConfig:
Type: Json
Description: Configuration for function F1
Default: {}
Resources:
F1:
Type: 'ALIYUN::Serverless::Function'
Properties:
Handler: 'index.handler'
Runtime: 'nodejs12'
Timeout: 60
CodeUri: './code/'
MemorySize: 256
EnvironmentVariables:
TEST: '123'
FunctionName:
Fn::Join:
- '-'
- - { "Ref": "AWS::StackName" }
- 'f1'
FunctionConfig:
${Fn::JsonValue: !Ref FunctionConfig}
F2:
Type: "ALIYUN::ROS::Stack"
Properties:
TemplateURL: https://ros-templates-xxx.oss.aliyun.com/cloudformation-transform-templates/function.yml
TemplateBody: |
{
"ROSTemplateFormatVersion": "2015-09-01",
"Resources": {
"Function": {
"Type": "ALIYUN::Serverless::Function",
"Properties": {
"FunctionName": "Fn::Join": ["-", [{ "Ref": "AWS::StackName" }, "f2"]],
"Handler": { "Fn::GetAtt" : ["F1", "Handler"] },
"Runtime": { "Fn::GetAtt" : ["F1", "Runtime"] },
"Timeout": { "Fn::GetAtt" : ["F1", "Timeout"] },
"MemorySize": { "Fn::GetAtt" : ["F1", "MemorySize"] },
"CodeUri": { "Fn::GetAtt" : ["F1", "CodeUri"] },
"EnvironmentVariables": { "Fn::GetAtt" : ["F1", "EnvironmentVariables"] }
}
}
}
}
Parameters:
FunctionConfig: { "Fn::GetAtt" : ["F1", "FunctionConfig"] }
Metadata:
Aliyun::ROS::StackWaitConditionHandle:
Type: "ALIYUN::ROS::StackWaitConditionHandle"
F3:
Type: "ALIYUN::ROS::Stack"
Properties:
TemplateURL: https://ros-templates-xxx.oss.aliyun.com/cloudformation-transform-templates/function.yml
TemplateBody: |
{
"ROSTemplateFormatVersion": "2015-09-01",
"Resources": {
"Function": {
"Type": "ALIYUN::Serverless::Function",
"Properties": {
"FunctionName": "Fn::Join": ["-", [{ "Ref": "AWS::StackName" }, "f3"]],
"Handler": { "Fn::GetAtt" : ["F1", "Handler"] },
"Runtime": { "Fn::GetAtt" : ["F1", "Runtime"] },
"Timeout": { "Fn::GetAtt" : ["F1", "Timeout"] },
"MemorySize": { "Fn::GetAtt" : ["F1", "MemorySize"] },
"CodeUri": { "Fn::GetAtt" : ["F1", "CodeUri"] },
"EnvironmentVariables": { "Fn::GetAtt" : ["F1", "EnvironmentVariables"] }
}
}
}
}
Parameters:
FunctionConfig: { "Fn::GetAtt" : ["F1", "FunctionConfig"] }
Metadata:
Aliyun::ROS::StackWaitConditionHandle:
Type: "ALIYUN::ROS::StackWaitConditionHandle"
CopyFunction:
Type: "ALIYUN::ROS::CustomResource"
Properties:
ServiceToken: "acs:fc:::services/ros-function-resources.test"
FunctionName: {
"Fn::Join": ["-", [{ "Ref": "AWS::StackName" }, "f1"]]
}
NewFunctionName: {
"Fn::Join": ["-", [{ "Ref": "AWS::StackName" }, "f2"]]
}
在上面的 YAML 文件中,我们定义了三个函数资源 F1、F2 ��� F3,其中 F1 的参数采用了模板化参数的方式。而对于 F2 和 F3,我们直接使用了 ROS Support Client 的 capabilities.renameStack API 来复制 F1 的函数资源,并修改它们的 FunctionName 等相关属性。
需要注意的是,YAML 文件中的 CopyFunction 部分是使用 ROS Support Client 的自定义资源类型实现的。具体来说,我们定义了一个名为 CopyFunction 的资源对象,在该资源的 Properties 中设置了要复制的函数名 FunctionName 和新函数名 NewFunctionName。然后,当 ROS 服务收到该资源创建或更新的请求时,将会调用 capabilities.renameStack API 来实现函数的复制。
在实践中,您可以根据实际需求,设置多个参数化的函数资源,并通过 ROS Support Client API 来实现函数资源的复制和修改。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。