开发者社区> 问答> 正文

在资源编排ROS我想同时创建,F1,F2,F3,这个场景推荐的做法是什么呢?

在资源编排ROS我想同时创建,F1,F2,F3,其中F1的参数在界面上填,F2,F3都复制F1的不用手填;这个场景推荐的做法是什么呢?我之前想的就是Fn::GetAtt [F1 InstanceType]。

展开
收起
三分钟热度的鱼 2023-06-12 17:21:37 74 0
2 条回答
写回答
取消 提交回答
  • 推荐同一个参数被三个F引用。此回答整理自钉群“资源编排ROS客户支持群”

    2023-06-12 19:47:49
    赞同 展开评论 打赏
  • 如果您需要同时创建多个函数资源,其中某些函数资源的参数需要手工填写,而另外的函数资源则可以直接复制其他已经定义好的函数资源,那么您可以考虑使用 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 来实现函数资源的复制和修改。

    2023-06-12 18:12:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关镜像