作ったのは誰?EC2 インスタンス作成時に作成者を自動でタグ付与してみた
こんにちは。テクニカルサポートチームの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": [
"*"
]
}
]
}
・信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TrustEventBridgeService",
"Effect": "Allow",
"Principal": {
"Service": [
"ssm.amazonaws.com",
"events.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
オートメーション用サービスロール
・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"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ssm.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
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.EventBridge ルールの設定
EventBridge ルールの作成を行います。
任意の名前を入力し、ルールタイプではイベントパターンを持つルールを選択します。
イベントパターンのフィールドに次の値を入力します。
{
"source": ["aws.ec2"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventName": ["RunInstances"]
}
}
ターゲットタイプでは 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 イベントのオートメーション実行ロール名を選択し、ルールの作成を行います。
やってみた
IAM ユーザを利用してインスタンス起動
IAM ユーザを利用し、マネジメントコンソールより新しく EC2 インスタンスを起動してみます。
EventBridge ルールによりオートメーションが実行されました。
EC2 インスタンスのタグに Owner のキーが付与され、値に EC2 インスタンスを作成した IAM ユーザ名が付与されました。
スイッチロールを利用してインスタンス起動
スイッチロールした状態でマネジメントコンソールより新しく EC2 インスタンスを起動してみます。
EC2 インスタンスのタグに Owner のキーが付与され、値に EC2 インスタンスを作成した IAM ロール名が付与されました。
CloudFormation テンプレートでインスタンス起動
IAM ユーザを利用し、CloudFormation テンプレートで EC2 インスタンスを起動した場合も試してみました。
CloudFormation スタックを作成し、新しく EC2 インスタンスを起動してみます。
こちらも同様に EC2 インスタンスのタグに Owner のキーが付与され、値に CloudFormation スタックを作成した IAM ユーザ名が付与されました。
まとめ
インスタンス起動時に自動でタグを付与しておくことで、後から CloudTrail から作成者を調べるといった手間が省けます。
Lambda 関数を利用してタグを付与する方法もありますが、Systems Manager オートメーションで CreateTags API を利用してタグを付与することができます。
簡易的な仕組みを Lambda 関数不要で実装できるため、管理と運用が楽になるかと思います。
本記事が誰かのお役に立てれば幸いです。
参考