EventBridgeとLambdaを使用して、新規構築したEC2に自動タグ付けする
AWSリソース管理のためにEC2インスタンスへの自動タグ付けをやってみました。
EC2を新規構築すると、CloudTrailにログが出力されます。それをEventBridgeで検出して、Lambdaで自動タグ付けをしてみたいと思います。
Lambdaの内容も難しくないものになっていますので、みなさんも楽しみながら自動化されてみてはいかがでしょうか。
リソース管理がやりやすくなるかと思います。
それでは、早速やっていきます。
IAMポリシー/ロールの作成
まずは、Lambda関数に実行権限を付与するIAMポリシー/ロールを作成していきます。
IAMサービスからポリシーを選択し、ポリシーの作成を行います。
ポリシーの作成でJSONタブに切り替えて、以下のJSONを入力します。
EC2インスタンスへのタグ付け用と、LambdaではCloudWatchLogsにログを出力するので、ログ関連の許可を付与しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:CreateTags"
],
"Resource": "*"
}
]
}
ポリシーの確認画面で、名前を入力してポリシーの作成
を選択します。
次に、IAMロールを作成していきます。
IAMサービスからロールを選択しロールを作成
を選択します。
信頼されたエンティティタイプでAWSのサービス
を選択し、ユースケースをLambda
にします。
許可の追加で、先程作成したポリシーを選択します。
ロールの詳細で名前を入力しロールを作成
を選択します。
Lambdaの作成
次に、Lambda関数を作成していきます。
Lambdaサービスに移動し関数の作成
を選択します。
以下の通り、ステータスを設定します。
デフォルトの実行ルールは、さきほど作成したIAMロールを選択してください。
詳細設定については、今回は変更していません。
Lambda関数が作成されました。
まだ、トリガーとなるものがありませんが、後ほど作成するEventBridgeルールがトリガーに追加されます。
次に、以下のようにコードソースを書き換えてDeploy
を選択し、上書きします。
CloudTrailに作成されるログから、インスタンスID(instanceID)、作成ユーザー(userName)、構築日時(createDate)を取得して、EC2のタグ情報として渡しているだけです。
import boto3, json
def lambda_handler(event, content):
instanceId = event['detail']['responseElements']['instancesSet']['items'][0]['instanceId']
userName = event['detail']['userIdentity']['userName']
creationDate = event['detail']['userIdentity']['sessionContext']['attributes']['creationDate'][:10]
ec2 = boto3.client('ec2')
ec2.create_tags(
Resources=[instanceId,],
Tags=[
{'Key': 'Owner', 'Value': userName},
{'Key': 'CreationDate', 'Value': creationDate},
]
)
return {
'statusCode': 200,
'body': json.dumps('Excuted!')
}
詳しいログの中身が知りたい方は、CloudTrailの証跡でRunInstances
からすべてのログの中身が参照できます。
今回は、ログの内容については割愛します。
EventBridgeルールの作成
最後に、EventBridgeのルールを作成していきます。
EC2インスタンスが新規構築されるとCloudTrailにRunInstance
ログが発行されるので、
そのログをEventBridgeで検知して、後続のLambdaを起動するように設定していきます。
EventBridgeサービスのルールからルールを作成
を選択します。
ルールの詳細で、名前と説明を入力していきます。
イベントバスはAWSサービスの場合default
で大丈夫です。
次に、イベントパターンを以下のように入力します。
CloudTrailに作成されるEC2に対するログのRunInstances
と一致したときに、イベントルールが実行されます。
ターゲットには、先程作成したLambda関数を入力します。
バージョン/エイリアス設定と、追加設定は変更していません。
確認と更新画面で、設定に問題がなければルールを作成
を選択します。
EventBridgeのターゲットとしてLambdaを指定したことで、Lambda側のトリガーとしてEventBridgeが表示されるようになりました。
以上で準備は完了です。
早速EC2インスタンスを作成していきたいと思います。
EC2インスタンスの作成
EC2インスタンスを作成していきます。
作成内容は割愛します。
タグが自動で付与されているか確認していきます。
んっ!?名前タグ以外に何も作成されていません。。。
CloudTrailでRunInstances
ログが作成されているか確認していきます。
イベント履歴を確認すると、問題なくRunInstance
ログが作成されていました。
実は、CloudTrailではイベント履歴に表示されていても証跡
を取得するように設定しないとイベントとして他のAWSサービスは認識してくれません。
それでは、CloudTrailサービスから証跡
を選択し、証跡の作成
を選択します。
以下のようにパラメータを設定してください。
ログファイルの検証という項目を今回は無効にしています。
ログファイルの書き換えなどの不正をしていないか検証してくれますが、個人使用では必要ないかと思います。
また、CloudWatchLogsに証跡ログを出力してモニタリングすることもできますが、今回は無効にしています。
あとの設定はそのままで、確認と作成画面で証跡の作成
を選択します。
証跡が取得され始めますので、再度EC2インスタンスを作成してみたいと思います。
今度は問題なくタグが自動付与されました。
実は、証跡の作成が必要とわかるまで、数時間EventBridgeルールなどと格闘していました。。
意外なところに落とし穴があるものです。
参考資料
新規作成したAWSリソースへの自動タグ付け処理(SKY BLOG)
参考にさせていただきました、ありがとうございます。
以上です、お疲れさまでした。
先日、ブルージャイアントエクスプローラの7巻が発売されましたね!
私が、唯一読んでいる漫画なんですが、主人公の熱いところが最高に好きなんです。
興味がある方は、読まれてみてください。
Discussion