背景情報
企業は、毎月各プロジェクトチームが使用するECSインスタンスとその関連リソース (クラウドディスク、ENI、EIP、スナップショットなど) のコストを計算する必要があります。 各プロジェクトチームは別々のCIDRブロックを使用します。 企業は、ECSインスタンスとその関連リソースのコストをCIDRブロックで計算したいと考えています。
この場合、企業は、異なるCIDRブロック内のECSインスタンスとその関連リソースに異なるタグを追加し、CIDRブロックとタグごとにECSインスタンスとその関連リソースのコストを要約できます。 これは、OOSを使用して実装できます。
制限事項
デフォルトでは、リージョンにデプロイされた OOS は、そのリージョンにおけるリソースのみ管理できます。 たとえば、中国 (杭州) リージョンにデプロイされた OOS を使用する場合、中国 (杭州) リージョンでのみ ECS インスタンスを管理できます。 ただし、OOS には、他のリージョンにデプロイされたリソースを管理する方法も存在します。 他のリージョンで API 操作を呼び出す場合は、ACS::ExecuteAPI 操作でリージョン ID を指定します。 この方法は使用しないことを推奨します。 OOSがデプロイされているリージョンが、管理するECSインスタンスが存在するリージョンと同じであることを確認する必要があります。 OOSの制限の詳細については、「制限」をご参照ください。
手順
OOSコンソールにログインしてカスタムテンプレートを作成して実行します。
左側のナビゲーションウィンドウで、[自動タスク] > [カスタムテンプレート] を選択します。
ECS_TagEcsResourcesByInstanceAndIpCIDRという名前の子テンプレートを作成します。
子テンプレートがネストされているECS_TagEcsResourcesByIpCIDRという名前の親テンプレートを作成します。
親テンプレートECS_TagEcsResourcesByIpCIDRの実行を作成します。
次の設定を完了する必要があります。
実行の詳細については、「概要」をご参照ください。
ECSコンソールにログインし、管理するECSインスタンスが存在するリージョンを選択し、ECSインスタンスとその関連リソースにタグが追加されているかどうかを確認します。
費用と費用コンソールにログインして、
タグで請求書を表示します。
詳細については、「コスト配分タグに基づく分割請求書の表示」をご参照ください。
子テンプレート: 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}}'