コスト配分タグのアクティブ化をスケジュールで自動化する

# 初めに
Organizationsで管理するコスト配分タグについて、アクティブ化漏れを防ぐためにスケジュールで有効化する機会があったのでその内容について記載します。

# コスト配分タグとは
タグはAWSに割り当てるラベルで、キーと値から構成されます。
タグを割り当てておくことでAWSのコストについてもタグごとに管理することができます。
逆にタグがついていないと詳細にコストを追うことが困難になることがあるので注意が必要だと思います。

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html


# 構成
本当はコスト配分タグが追加される度に有効化ができればよかったのですが、そのやり方は難しそうだったのでコスト配分タグの有効化を行うLambdaをEventBridgeでスケジュール実行する形をとりました。
Lambdaで実行するコマンドは以下の2つです。

https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_ListCostAllocationTags.html

https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_UpdateCostAllocationTagsStatus.html

# Lambda
Pythonで記載しています。
「ListCostAllocationTags」で非アクティブのコスト配分タグのリストを取得し、「UpdateCostAllocationTagsStatus」で有効化する処理です。

```
import boto3

client = boto3.client('ce')

def lambda_handler(event, context):
    try:
        print(f'START: ListCostAllocationTags')
        response = client.list_cost_allocation_tags(
            Status='Inactive',
            Type='UserDefined'
        )
        print(f'InactiveList: {response}')
        print(f'END: ListCostAllocationTags')
        print(f'START: UpdateCostAllocationTagsStatus')
        for x in response['CostAllocationTags']:
            print(f'TagKey: {x.get('TagKey')}')
            client.update_cost_allocation_tags_status(
                CostAllocationTagsStatus=[
                    {
                        'TagKey': x.get('TagKey'),
                        'Status': 'Active'
                    }
                ]
            )
        print(f'END: UpdateCostAllocationTagsStatus')
        print(f'<<< SUCCESS >>>')
        return('200')
    except Exception as e:
        print(f'<<< ERROR: {e} >>>')
        return('400')

```

また、LambdaのIAMロールには以下の権限付与をしておきます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ce:UpdateCostAllocationTagsStatus",
                "ce:ListCostAllocationTags"
            ],
            "Resource": "*"
        }
    ]
}
```

# EventBridge
EventBridgeのスケジュール機能で作成したLambdaを定期実行するようにスケジュール設定を行います。
実行間隔は任意の間隔で、ターゲットに作成したLambdaを指定します。

# 検証
コスト配分タグの一部を非アクティブ化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/918e1b37-ccde-9206-e614-7287830493a5.png)


LambdaをPythonで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/43eaafee-485f-6e04-fcbb-4c21fd81f208.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/0b5e0265-f509-74d2-c066-04e8c82348bd.png)

EventBridgeのスケジュールでLambdaを指定したスケジュールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/b2f00f6a-08e5-136c-9555-a28e769c1aba.png)

スケジュールで実行されるのを待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/cd3c6b30-d8e1-69ad-09d3-a1e55673e9ce.png)

非アクティブ化したコスト配分タグが有効化されるのを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517194/9e5f1a65-e6db-829d-8f0d-d602ef8f78a1.png)


# 終わりに
Organizationsで新たにAWSアカウントを招待した時にはコスト配分タグは非アクティブとなってしまうので、そのような場合にアクティブ化漏れを防ぐことが可能です。
何かの参考になれば幸いです。