作ったのは誰?EC2 インスタンス作成時に作成者を自動でタグ付与してみた

作ったのは誰?EC2 インスタンス作成時に作成者を自動でタグ付与してみた

Clock Icon2024.11.13

こんにちは。テクニカルサポートチームのShiinaです。

はじめに

開発や検証環境の AWS アカウントを運用していると、この EC2 インスタンスを作った人は誰だろう?と確認が必要になるケースがよくあります。
起動しっぱなしのインスタンスがある時、作成者がわからないと、停止や削除をしてよいものなのか判断がつきません。
Name タグに自分の名前を入れることを環境利用ルールとして定めていても、設定し忘れやルールが守られないこともあります。
新規で EC2 インスタンスを起動した時に EventBridge ルールと Systems Manager のオートメーションを利用して、自動でインスタンスの作成者をタグに付与してみました。

概要

EventBridge ルールを利用して、EC2 の RunInstances イベント発生時に Systems Manager オートメーションを実行します。
オートメーションでは CreateTags API を呼び出し、インスタンスの作成者を所有者(Owner)とするタグの付与を行います。
自動で付与するタグは次の通りです。
キー:Owner
値:RunInstances の API を実行した IAM ユーザ名または IAM ロール名

前提

タグの値に付与する RunInstances の API を実行した IAM ユーザ名、IAM ロール名は CloudTrail userIdentity エレメントの情報を利用します。
IAM ユーザを利用した場合は API を実行した IAM ユーザ名が付与され、
スイッチロールを利用した場合は API を実行した IAM ロール名が付与されます。

設定の流れ

はじめに、EventBridge イベントに基づくオートメーションの実行に必要なロールと、オートメーション用のサービスロールの設定を行います。
次に Systems Manager オートメーションドキュメントを作成し、EventBridge ルールの作成を行なっていきます。

設定手順

1.IAMロール設定

EventBridge イベントに基づくオートメーションの実行に必要なロール、 オートメーション用サービスロールをそれぞれ作成します。

EventBridge イベントのオートメーション実行ロール

・IAM ロール名
Invoke-Automation-Execution-Role

・許可

  • インラインポリシー:StartAutomationExecution
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ActionForSSMAutomation",
            "Action": "ssm:StartAutomationExecution",
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ]
}

Invoke-Automation-Execution-Role-IAM1

・信頼関係

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "TrustEventBridgeService",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "ssm.amazonaws.com",
                    "events.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Invoke-Automation-Execution-Role-IAM2

オートメーション用サービスロール

・IAM ロール名
Automation-Execute-Role

・許可

  • AmazonSSMAutomationRole
  • インラインポリシー:PassRolePolicy

AWSアカウントIDはご自身の環境のものに修正してください。
タグ付与に必要なポリシーは AmazonSSMAutomationRole に包括されているため、こちらを利用します。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": "iam:PassRole",
			"Resource": "arn:aws:iam::XXXXXXXXXXX:role/Automation-Execute-Role"
		}
	]
}

Automation-Execute-Role-IAM1

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Automation-Execute-Role-IAM2

2.オートメーションドキュメント作成

Systems Manager ドキュメントよりドキュメントの作成メニューよりオートメーションをクリックします。

ドキュメント作成

任意の名前を入力します。
コードタブをクリックします。
下記コードをコピーしてペーストし、ランブックを作成をクリックします。
assumeRole の arn はご自身の環境のものに修正してください。

schemaVersion: '0.3'
description: Automation to tag EC2 instances with owner information from CloudTrail event
parameters:
  InstanceId:
    type: StringList
    description: Target InstanceId.
  UserType:
    type: String
    description: User Identity Type.
  UserName:
    type: String
    description: User Name.
  RoleName:
    type: String
    description: User Role Name.
assumeRole: arn:aws:iam::xxxxxxxxxxxx:role/Automation-Execute-Role
mainSteps:
  - name: Branch
    action: aws:branch
    isEnd: true
    inputs:
      Choices:
        - NextStep: TagStepIAMUserType
          Variable: '{{ UserType }}'
          StringEquals: IAMUser
        - NextStep: TagStepAssumedRoleType
          Variable: '{{ UserType }}'
          StringEquals: AssumedRole
  - name: TagStepIAMUserType
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ec2
      Api: CreateTags
      Tags:
        - Key: Owner
          Value: '{{ UserName }}'
      Resources: '{{ InstanceId }}'
  - name: TagStepAssumedRoleType
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ec2
      Api: CreateTags
      Tags:
        - Key: Owner
          Value: '{{ RoleName }}'
      Resources: '{{ InstanceId }}'

ドキュメント作成3

3.EventBridge ルールの設定

EventBridge ルールの作成を行います。

ルール1

任意の名前を入力し、ルールタイプではイベントパターンを持つルールを選択します。
ルール2

イベントパターンのフィールドに次の値を入力します。

{
  "source": ["aws.ec2"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventName": ["RunInstances"]
  }
}

ルール3

ターゲットタイプでは AWS のサービスを選択します。
Systems Manager オートメーションを選択し、ドキュメントでは作成済みのドキュメント名を選択します。
自動化パラメータ設定では入力トランスフォーマを選択します。

入力パス、テンプレートは次のように設定を行います。

  • 入力パス
{
  "InstanceId": "$.detail.responseElements.instancesSet.items[0].instanceId",
  "RoleName": "$.detail.userIdentity.sessionContext.sessionIssuer.userName",
  "UserName": "$.detail.userIdentity.userName",
  "UserType": "$.detail.userIdentity.type"
}
  • テンプレート
{
    "InstanceId": ["<InstanceId>"],
    "UserType": ["<UserType>"],
    "UserName":["<UserName>"],
    "RoleName":["<RoleName>"]
}

実行ロールは既存のロールにチェックを入れ、作成した EventBridge イベントのオートメーション実行ロール名を選択し、ルールの作成を行います。

ルール作成5

やってみた

IAM ユーザを利用してインスタンス起動

IAM ユーザを利用し、マネジメントコンソールより新しく EC2 インスタンスを起動してみます。
Launch-an-instance-EC2-ap-northeast-1-11-08-2024_05_29_PM

EventBridge ルールによりオートメーションが実行されました。

Automation-Systems-Manager-ap-northeast-1-11-08-2024_06_17_PM

EC2 インスタンスのタグに Owner のキーが付与され、値に EC2 インスタンスを作成した IAM ユーザ名が付与されました。

ec2作成iam

スイッチロールを利用してインスタンス起動

スイッチロールした状態でマネジメントコンソールより新しく EC2 インスタンスを起動してみます。
EC2 インスタンスのタグに Owner のキーが付与され、値に EC2 インスタンスを作成した IAM ロール名が付与されました。

ec2作成ロール

CloudFormation テンプレートでインスタンス起動

IAM ユーザを利用し、CloudFormation テンプレートで EC2 インスタンスを起動した場合も試してみました。
CloudFormation スタックを作成し、新しく EC2 インスタンスを起動してみます。

CloudFormation-スタック-ec2-test-11-13-2024_01_53_PM

こちらも同様に EC2 インスタンスのタグに Owner のキーが付与され、値に CloudFormation スタックを作成した IAM ユーザ名が付与されました。

ec2作成スタック

まとめ

インスタンス起動時に自動でタグを付与しておくことで、後から CloudTrail から作成者を調べるといった手間が省けます。
Lambda 関数を利用してタグを付与する方法もありますが、Systems Manager オートメーションで CreateTags API を利用してタグを付与することができます。
簡易的な仕組みを Lambda 関数不要で実装できるため、管理と運用が楽になるかと思います。

本記事が誰かのお役に立てれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.