すべてのプロダクト
Search
ドキュメントセンター

Resource Management:タグを使用してプライベートCIDRブロックに基づいてECSコストを割り当てる

最終更新日:Jan 08, 2025

CloudOps Orchestration Service (OOS) でカスタムテンプレートを作成して実行し、Elastic Compute Service (ECS) インスタンスと、クラウドディスク、elastic network Interface (ENI) 、elastic IPアドレス (EIP) 、スナップショットなどの関連リソースに特定のCIDRブロックでタグを追加できます。 次に、タグに基づいて請求書を表示できます。

背景情報

企業は、毎月各プロジェクトチームが使用するECSインスタンスとその関連リソース (クラウドディスク、ENI、EIP、スナップショットなど) のコストを計算する必要があります。 各プロジェクトチームは別々のCIDRブロックを使用します。 企業は、ECSインスタンスとその関連リソースのコストをCIDRブロックで計算したいと考えています。

この場合、企業は、異なるCIDRブロック内のECSインスタンスとその関連リソースに異なるタグを追加し、CIDRブロックとタグごとにECSインスタンスとその関連リソースのコストを要約できます。 これは、OOSを使用して実装できます。

制限事項

デフォルトでは、リージョンにデプロイされた OOS は、そのリージョンにおけるリソースのみ管理できます。 たとえば、中国 (杭州) リージョンにデプロイされた OOS を使用する場合、中国 (杭州) リージョンでのみ ECS インスタンスを管理できます。 ただし、OOS には、他のリージョンにデプロイされたリソースを管理する方法も存在します。 他のリージョンで API 操作を呼び出す場合は、ACS::ExecuteAPI 操作でリージョン ID を指定します。 この方法は使用しないことを推奨します。 OOSがデプロイされているリージョンが、管理するECSインスタンスが存在するリージョンと同じであることを確認する必要があります。 OOSの制限の詳細については、「制限」をご参照ください。

手順

  1. OOSコンソールにログインしてカスタムテンプレートを作成して実行します。

    1. 左側のナビゲーションウィンドウで、[自動タスク] > [カスタムテンプレート] を選択します。

    2. ECS_TagEcsResourcesByInstanceAndIpCIDRという名前の子テンプレートを作成します。

      サンプルYAMLテンプレートの詳細については、「子テンプレート: ECS_TagEcsResourcesByInstanceAndIpCIDR」をご参照ください。 テンプレートの作成方法については、「テンプレートの作成」をご参照ください。

    3. 子テンプレートがネストされているECS_TagEcsResourcesByIpCIDRという名前の親テンプレートを作成します。

      サンプルYAMLテンプレートの詳細については、「親テンプレート: ECS_TagEcsResourcesByIpCIDR」をご参照ください。 テンプレートの作成方法については、「テンプレートの作成」をご参照ください。

    4. 親テンプレートECS_TagEcsResourcesByIpCIDRの実行を作成します。

      次の設定を完了する必要があります。

      • リージョンを選択します。

      • CIDRブロックとCIDRブロックに追加するタグを指定します。

      実行の詳細については、「概要」をご参照ください。

  2. ECSコンソールにログインし、管理するECSインスタンスが存在するリージョンを選択し、ECSインスタンスとその関連リソースにタグが追加されているかどうかを確認します。

  3. 費用と費用コンソールにログインして、

    タグで請求書を表示します。

    詳細については、「コスト配分タグに基づく分割請求書の表示」をご参照ください。

子テンプレート: ECS_TagEcsResourcesByInstanceAndIpCIDR

テンプレート名: ECS_TagEcsResourcesByInstanceAndIpCIDR

テンプレートの説明: テンプレートでリージョンID、ECSインスタンスID、1つ以上のタグ、およびCIDRブロックを指定すると、システムは指定されたECSインスタンスがCIDRブロックにあるかどうかを確認します。 ECSインスタンスがCIDRブロックにある場合、システムは指定されたタグをECSインスタンスとその関連リソース (クラウドディスク、スナップショット、ENI、EIPなど) に追加します。

テンプレートの内容:

FormatVersion: OOS-2019-06-01
Description: A template used to filter ECS instances by CIDR block and instance ID, and add tags to ECS instances that meet requirements and resources that are associated with the ECS instances. 
Parameters:
  regionId:
    Description:
      name-en: The id of region  
    Type: String
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  OOSAssumeRole:
    Description: The RAM role assumed by OOS.
    Type: String
    Default: OOSServiceRole
  tags:
    Type: Json
    AssociationProperty: Tags
    Description: The tags to add.
  ipCidr:
    Type: String
    Description: The CIDR block.
  instanceId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::InstanceId
    AssociationPropertyMetadata:
      RegionId: regionId
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: getEcsInstance
    Action: ACS::ExecuteAPI
    Description: DescribeInstances
    Properties:
      Service: ECS
      API: DescribeInstances
      Parameters:
        RegionId: '{{ regionId }}'
        InstanceIds:
          - '{{instanceId}}'
    Outputs:
      getIpAddressAndInstanceId:
        Type: Json
        ValueSelector: '.Instances.Instance | map(select(.InstanceId=="{{instanceId}}") ) | .[] |  {"InstanceId": .InstanceId,"PrivateIpAddress": .NetworkInterfaces.NetworkInterface[].PrivateIpSets.PrivateIpSet[].PrivateIpAddress}'
  - Name: isIpInCidr
    Action: ACS::Choice
    Properties:
      DefaultTask: ACS::END
      Choices:
        - When:
            Fn::And:
              - Fn::Not:
                  Fn::Equals:
                    - Null
                    - '{{getEcsInstance.getIpAddressAndInstanceId}}'
              - Fn::IsIpInCIDR:
                  - Fn::Jq:
                      - First
                      - .PrivateIpAddress
                      - '{{getEcsInstance.getIpAddressAndInstanceId}}'
                  - '{{ipCidr}}'
          NextTask: tagEcsInstance
  - Name: tagEcsInstance
    Action: ACS::ExecuteAPI
    Description: Tag Ecs InstanceId
    Properties:
      Service: ECS
      API: TagResources
      Parameters:
        RegionId: '{{ regionId }}'
        ResourceIds:
          - '{{instanceId}}'
        Tags: '{{tags}}'
        ResourceType: Instance
    Outputs:
      reqResult:
        Type: Json
        ValueSelector: .RequestId
  - Name: tagDisk
    Action: ACS::Template
    Description:
      en: Update disk tags by ecs instance tags
    Properties:
      TemplateName: ACS::ECS::UpdateDiskTagsByEcsInstanceTags
      Parameters:
        regionId: '{{ regionId }}'
        instanceId: '{{instanceId}}'
        tagKeys:
          Fn::Jq:
            - All
            - .[].Key
            - '{{tags}}'
        isUpdate: true
  - Name: tagSnapshot
    Action: ACS::Template
    Description:
      en: Update snapshot tags by ecs instance tags
    Properties:
      TemplateName: ACS::ECS::UpdateSnapshotTagsByEcsInstanceTags
      Parameters:
        regionId: '{{ regionId }}'
        instanceId: '{{instanceId}}'
        tagKeys:
          Fn::Jq:
            - All
            - .[].Key
            - '{{tags}}'
        isUpdate: true
  - Name: tagENI
    Action: ACS::Template
    Description:
      en: Update eni tags by ecs instance tags
    OnSuccess: ACS::END
    Properties:
      TemplateName: ACS::ECS::UpdateEniTagsByEcsInstanceTags
      Parameters:
        regionId: '{{ regionId }}'
        instanceId: '{{instanceId}}'
        tagKeys:
          Fn::Jq:
            - All
            - .[].Key
            - '{{tags}}'
        isUpdate: true
  - Name: tagEIP
    Action: ACS::Template
    Description:
      en: Update eip tags By ecs instance tags
    Properties:
      TemplateName: ACS::ECS::UpdateEipTagsByEcsInstanceTags
      Parameters:
        regionId: '{{ regionId }}'
        instanceId: '{{instanceId}}'
        tagKeys:
          Fn::Jq:
            - All
            - .[].Key
            - '{{tags}}'
        isUpdate: true
Outputs:
  invocationOutputs:
    Type: Json
    Value: '{{ getEcsInstance.getIpAddressAndInstanceId }}'
  tags:
    Type: Json
    Value: '{{tags}}'

親テンプレート: ECS_TagEcsResourcesByIpCIDR

テンプレート名: ECS_TagEcsResourcesByIpCIDR

テンプレートの説明: テンプレートの各CIDRブロックのECSインスタンスに追加するリージョンID、CIDRブロック、およびタグを指定すると、システムは指定されたリージョンのすべてのECSインスタンスを照会します。 ECSインスタンスが指定されたCIDRブロックにある場合、システムは関連するタグをECSインスタンスに追加します。

テンプレートの内容:

FormatVersion: OOS-2019-06-01
Description: A template used to filter ECS instances that meet requirements based on specified CIDR blocks and adds related tags to the instances and their associated resources. 
Parameters:
  regionId:
    Description: The region ID
    Type: String
    AssociationProperty: RegionId
    Default: '{{ ACS::RegionId }}'
  OOSAssumeRole:
    Description: The RAM role assumed by OOS.
    Type: String
    Default: OOSServiceRole
  ipCidrAndTags:
    Type: Json
    Description: |-
      The tags to add. [
        {
          "ipCidr": "192.168.0.0/16",
          "tags": [
            {
              "Value": "testALL",
              "Key": "project"
            }
          ]
        }
      ]
RamRole: '{{ OOSAssumeRole }}'
Tasks:
  - Name: getEcsInstance
    Description:
      en: Views the ECS instances.
    Action: ACS::SelectTargets
    Properties:
      ResourceType: ALIYUN::ECS::Instance
      Filters:
        - Type: All
          RegionId: '{{regionId}}'
          Parameters:
            RegionId: '{{regionId}}'
    Outputs:
      desData:
        Type: Json
        ValueSelector: '.Instances.Instance | [.[].InstanceId] as $tmpData | {{ipCidrAndTags}} |[{"ipCidr":.[].ipCidr, "tags":.[].tags, "instanceId": $tmpData[] }]'
  - Name: tagByIpCidr
    Action: ACS::Template
    Description: Tag Instance and related Resources
    OnSuccess: ACS::END
    Properties:
      TemplateName: ECS_TagEcsResourcesByInstanceAndIpCIDR
      Parameters:
        regionId: '{{ regionId }}'
        tags:
          Fn::Jq:
            - All
            - .tags[]
            - '{{ACS::TaskLoopItem}}'
        ipCidr:
          Fn::Jq:
            - First
            - .ipCidr
            - '{{ACS::TaskLoopItem}}'
        instanceId:
          Fn::Jq:
            - First
            - .instanceId
            - '{{ACS::TaskLoopItem}}'
    Loop:
      RateControl:
        Mode: Concurrency
        MaxErrors: 100
        Concurrency: 1
      Items: '{{getEcsInstance.desData}}'
      Outputs:
        tagResult:
          AggregateType: Fn::ListJoin
          AggregateField: reqResult
Outputs:
  tags:
    Type: Json
    Value: '{{getEcsInstance.desData}}'