Amazon Web Services ブログ

AWS リソースのタグ管理 〜タグ付けと統制〜(後編)

AWS リソースにタグ付けをすると、リソース整理、コスト配分、アクセス制御などを行うことが可能です。本ブログではタグ付け戦略やアカウント分離戦略が検討済であるという前提のもとで、タグ付けの実装に関する情報を前後編に分けてご紹介しています。前編ではタグを効果的に活用するために (1) タグ付けを効果的に行う方法(2) タグ付けの統制を行う方法を、実際の操作や設定方法の参考となるウェブサイトと共にご紹介しました。後編ではタグ付けの目的に応じて (3)タグ付けと統制を行うための具体的なサンプルをご紹介します。ご紹介するサンプルは AWS CLI を使用した実装例です。

(3)タグ付けと統制を行うための具体的なサンプル

a. AWS リソースグループのタグ付け API を用いたタグ付け

AWS CLI でリソースグループのタグ付け API の機能を用いてタグ付けをする場合には resourcegroupstaggingapi を使用します。例えば、EC2 インスタンスに対しては以下の流れでタグ付けをすることが可能です。

① 特定リージョンの EC2 インスタンス一覧とタグ状況を確認

バージニア北部リージョンの EC2 インスタンスの一覧情報を取得します。

aws resourcegroupstaggingapi get-resources --resource-type-filters ec2:instance --region us-east-1

実行結果の例は以下となります。

{
    "ResourceTagMappingList": [
        {
            "ResourceARN": "arn:aws:ec2:us-east-1:499093605761:instance/i-0ef872be293eedb6b",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyEC2Server#1"
                }
            ]
        }
    ]
}

② 対象リソースにタグを付与

上で確認した EC2 インスタンスにタグキー “map-migrated”、タグ値 “d-server-1234567” を付与します。

aws resourcegroupstaggingapi tag-resources --resource-arn-list "arn:aws:ec2:us-east-1:499093605761:instance/i-0ef872be293eedb6b" --tags map-migrated=d-server-1234567

③ 再度対象リソースを確認

aws resourcegroupstaggingapi get-resources --resource-type-filters ec2:instance --region us-east-1

実行結果の例は以下となります。map-migrated のタグが付与されていることがわかります。

{
    "ResourceTagMappingList": [
        {
            "ResourceARN": "arn:aws:ec2:us-east-1:499093605761:instance/i-0ef872be293eedb6b",
            "Tags": [
                {
                    "Key": "map-migrated",                     "Value": "d-server-1234567"
                },
                {
                    "Key": "Name",
                    "Value": "MyEC2Server#1"
                }
            ]
        }
    ]
}

 

b.リアクティブガバナンスとしてのタグ統制

例1) AWS Organizations のタグポリシーを用いたタグ値誤り検知のための設定

AWS CLI の organizations コマンド を使用して、特定のタグキーに指定のタグ値が付けられていることを確認し、誤りがある場合の検知が可能です。Organizations 配下のアカウントにおいてタグキー “map-migrated” が付けられた場合に、タグ値として “d-server-13579” もしくは “d-server-24680” が付けられていることを検査する方法は以下の流れとなります。

①タグポリシーの content 準備

検査内容を tag-policy-content.json というファイルに保存しておきます。

{
    "tags": {
        "map-migrated": {
            "tag_key": {
                "@@assign": "map-migrated"
            },
            "tag_value": {
                "@@assign": [
                    "d-server-13579",
                    "d-server-24680"
                ]
            }
        }
    }
}
②タグポリシーの作成

上記で準備したファイルを用いてタグポリシーを作成します。

aws organizations create-policy --content file://tag-policy-content.json --description "Tag policy created by CLI" --name my-cli-tag-policy --type TAG_POLICY

実行結果の例は以下となります。

{
    "Policy": {
        "PolicySummary": {
            "Id": "p-95c35i9fjp",
            "Arn": "arn:aws:organizations::499093605761:policy/o-g5cy6hvt9m/tag_policy/p-95c35i9fjp",
            "Name": "my-cli-tag-policy",
            "Description": "Tag policy created by CLI",
            "Type": "TAG_POLICY",
            "AwsManaged": false
        },
        "Content": "{\n    \"tags\": {\n        \"map-migrated\": {\n            \"tag_key\": {\n                \"@@assign\": \"map-migrated\"\n            },\n            \"tag_value\": {\n                \"@@assign\": [\n                    \"d-server-12345\",\n                    \"d-server-24680\"\n                ]\n            }\n        }\n    }\n}\n"
    }
}
③タグポリシーのアタッチ

上記で返されたId(policy id)使用して、タグポリシーをアタッチします。${TARGET_ID} にはポリシーをアタッチしたいアカウントID や Organizational Unit (OU) などを指定します。

aws organizations attach-policy --policy-id p-95c35i9fjp --target-id ${TARGET_ID}

これで特定のタグキーに指定のタグ値が付けられているか確認することが可能です。組織全体のポリシー準拠状況はユーザーガイドの「アカウントのコンプライアンスの評価」の情報を用いて確認することが可能です。

例2) AWS Config を用いたタグ値/タグキー誤り検知のための設定

AWS Config では、タグキーの誤りとタグ値の誤りを検知可能です。例えば 全ての EC2 インスタンスに対して、タグキー “map-migrated”、タグ値 “d-server-00000” が指定されていることを検査する AWS Config ルールは、 AWS CLIの configservice コマンド を用いて実装できます。

①ルールの準備

ルールのパラメータを含むスケルトンファイルを config-tags-rule.json というファイルに保存します。

aws configservice put-config-rule --generate-cli-skeleton > config-tags-rule.json

上で生成したファイルを必要なルールに合わせて手動で編集します。今回は、マネージドルールの required-tags の設定を元に、EC2 インスタンスには タグキー “map-migrted”、タグ値 “d-server-00000” が必要となるように変更します。以下は変更後の config-tags-rule.json の例です。

{
    "ConfigRule":  {
            "ConfigRuleName": "required-tags",
            "Description": "Checks whether my resources have the tags that I specify.",
            "Scope": {
                "ComplianceResourceTypes": [
                    "AWS::EC2::Instance"
                ]
            },
            "Source": {
                "Owner": "AWS",
                "SourceIdentifier": "REQUIRED_TAGS"
            },
            "InputParameters": "{\"tag1Key\":\"map-migrated\",\"tag1Value\":\"d-server-00000\"}",
            "ConfigRuleState": "ACTIVE",
            "EvaluationModes": [
                {
                    "Mode": "DETECTIVE"
                }
            ]
        }
}
②ルールの更新

変更済のルール config-tags-rule.json を以下のコマンドで AWS Config に渡します。

aws configservice put-config-rule --cli-input-json file://config-tags-rule.json

Organizations 配下のアカウントへの Config ルールの適用は、前編でご紹介した適合パックのデプロイで実現可能です。確認頻度が低いのであれば自動化を行わずに AWS リソースグループのタグ付け API を手動で定期的に実行し確認することでも代替可能です。

c.プロアクティブガバナンスとしてのタグ統制

例1) AWS Organizations のタグポリシーを用いたタグ値誤り制限のための設定

タグポリシーを強制として、誤ったタグ値が付けられることを禁止する例もご紹介します。例えば、タグキー “map-migrated” に対して、タグ値 “d-server-13579” もしくは “d-server-24680” を EC2 インスタンスに強制する場合には、前述の「b.リアクティブガバナンスとしてのタグ統制」の例1 と同じく organizations コマンドを用いて実装できます。使用する policy-content.json の例は以下のようになり、インスタンスの新規作成や起動済みインスタンスのタグ値変更の際にポリシーが準拠されていないとエラーとなります。

{
    "tags": {
        "map-migrated": {
            "tag_key": {
                "@@assign": "map-migrated"
            },
            "tag_value": {
                "@@assign": [
                    "d-server-13579",
                    "d-server-24680"
                ]
            },
 "enforced_for": { "@@assign": [ "ec2:instance" ] }
        }
    }
}

例2) AWS Organizations のサービスコントロールポリシーを用いた特定のタグキーがないサービス起動制限のための設定

サービスコントロールポリシーを使用することで特定のタグキーが付与されない状態でのサービスの起動を制限することができます。以下の例は、”map-migrated” というタグキーがない EC2 の起動を禁止します。

①サービスコントロールポリシーの content 準備

ポリシーの内容を scp-policy-content.json というファイルに保存しておきます。

{ 
    "Version": "2012-10-17", "Statement": [ { 
        "Sid": "DenyRunInstanceWithNoMapTag", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": [
        "arn:aws:ec2:*:*:instance/*" ],
        "Condition": { "Null": {"aws:RequestTag/map-migrated": "true" } }
    } ]
}
②サービスコントロールポリシーの作成

上記で準備したファイルを用いてサービスコントロールポリシーを作成します。

aws organizations create-policy --content file://scp-policy-content.json --description "SCP created by CLI" --name my-cli-service-control-policy --type SERVICE_CONTROL_POLICY

実行結果の例は以下となります。

{
    "Policy": {
        "PolicySummary": {
            "Id": "p-5u0pkp68",
            "Arn": "arn:aws:organizations::499093605761:policy/o-g5cy6hvt9m/service_control_policy/p-5u0pkp68",
            "Name": "my-cli-service-control-policy",
            "Description": "SCP created by CLI",
            "Type": "SERVICE_CONTROL_POLICY",
            "AwsManaged": false
        },
        "Content": "{ \"Version\": \"2012-10-17\", \"Statement\": [\n{ \n\"Sid\": \"DenyRunInstanceWithNoMapTag\", \"Effect\": \"Deny\", \"Action\": \"ec2:RunInstances\", \"Resource\": [\n\"arn:aws:ec2:*:*:instance/*\" ],\n\"Condition\": { \"Null\": {\n\"aws:RequestTag/map-migrated\": \"true\" } }\n}\n]}\n"
    }
}
③サービスコントロールポリシーのアタッチ

上記で返された policy id 使用して、ポリシーをアタッチします。${TARGET_ID} にはポリシーをアタッチしたいアカウント ID や Organizational Unit (OU) などを指定します。

aws organizations attach-policy --policy-id p-5u0pkp68 --target-id ${TARGET_ID}

例3) IAM を用いた特定のタグ値がないサービス起動制限のための設定

属性ベースのアクセスコントロール (Attribute Based Access Control = ABAC) は、属性に基づいてアクセス許可を定義する認可戦略です。IAM ポリシーではタグを属性とした条件設定をサポートしており、特定のタグキーやタグ値に基づいて IAM アクセス許可を設定できます。IAM を用いた ABAC に関する詳細はユーザーガイドの「AWS の ABAC とは」をご参照ください。

ここでは例として、EC2 インスタンスに タグキー “access-env”、タグ値 “prod” が付いているインスタンスに対して、特定ロールでは起動も停止もできないようにする制御を行います。

①特定リージョンの EC2 インスタンスの一覧とタグ状況を確認

1台のEC2インスタンスにタグキー “access-env”、タグ値 “prod” がついていることを確認します。

aws resourcegroupstaggingapi get-resources --resource-type-filters ec2:instance

実行結果の例は以下となります。

    "ResourceTagMappingList": [
        {
            "ResourceARN": "arn:aws:ec2:us-east-1:499093605761:instance/i-080825ea393905086",
            "Tags": [
                {
                    "Key": "access-env",
                    "Value": "prod"
                },
                {
                    "Key": "Name",
                    "Value": "MyEC2Server#2"
                }
            ]
        }
    ]
②ポリシーの準備

検査したい内容を iam-policy-content.json というファイルに保存しておきます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyStartStopProd",
            "Effect": "Deny",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:us-east-1:499093605761:instance/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/access-env": "prod"
                }
            }
        }
    ]
}
③ポリシーの作成

ポリシーを作成するために、create-policy コマンドを使用します。

aws iam create-policy --policy-name EC2DenyStartStopProd --policy-document file://iam-policy-content.json

実行結果の例は以下となります。コマンドが成功すると、作成されたポリシーの情報が返されます。

{
    "Policy": {
        "PolicyName": "EC2DenyStartStopProd",
        "PolicyId": "ANPAXINCMBWA5D3WMSUB2",
        "Arn": "arn:aws:iam::499093605761:policy/EC2DenyStartStopProd",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2023-05-05T12:07:27+00:00",
        "UpdateDate": "2023-05-05T12:07:27+00:00"
    }
}
④ポリシーのアタッチ

attach-role-policy を用いて operator ロールに対して当該のポリシーをアタッチします。

aws iam attach-role-policy --role-name Operator --policy-arn "arn:aws:iam::499093605761:policy/EC2DenyStartStopProd"

コマンドが成功すれば設定完了です。 この状態で operator ロールを持つユーザーで当該タグを付けたインスタンスをスタートしようとすると、エラーとなります。

aws ec2 start-instances --instance-ids i-080825ea393905086

実行結果の例は以下となります。

An error occurred (UnauthorizedOperation) when calling the StartInstances operation: You are not authorized to perform this operation.  (以降省略)

おわりに:

本ブログ は前後編に分かれており、前編ではタグを効果的に活用するために (1) タグ付けを効果的に行う方法 (2) タグ付けの統制を行う方法を、実際の操作や設定方法の参考となるウェブサイトとと共にご紹介しました。また後編では(3)タグ付けと統制を行うための具体的なサンプルをご紹介しました。タグ付け戦略やアカウント分離戦略を検討した上で適切なタグ付けを行うことで、AWSリソースの管理が容易になります。ぜひタグの有効利用を検討ください。

参考情報:

この記事はカスタマーソリューションマネージャーの北川裕介と髙木昇により作成されました。ご質問やお問い合わせは お問い合わせページ、もしくは担当営業までご連絡をお願いします。また、AWS リソースのタグ付けについては以下も併せてご参照ください。