[toc]
AWSでタグ付けによるコストの割り当て(コストアロケーション)をしている方が多いと思います。私が所属する組織でもタグ付けによってAWS料金を分けることをしています。 コストの分割をやりやすくしてくれるので嬉しい機能ですが、ついついタグ付けを忘れがちになります。特にS3のようなサービスはバケット作成やオブジェクトの設置は簡単にできるので、急ぎでバケットを作った場合などタグ付けを忘れてしまうこともあります。 タグ付けという行為をもっと楽にできないかなと考え、S3バケット作成時に自動的にタグを付ける方法をやってみたので紹介します。
概要
Amazon CloudWatch Events と AWS Lambda を用います。
Amazon CloudWatch Events(以下、CloudWatch Events) とは、AWSのAPIコールや状態の変化などのイベントをキャッチして処理を行える機能です。今回は「S3バケットの作成」というイベントをキャッチして処理を行うようにします。
AWS Lambdaはサーバレスでスクリプトを実行できる機能です。CloudWatch Eventsでキャッチしたイベント(S3バケットの作成)でLambda関数(スクリプト)を実行(発火)させて、S3バケットにタグを付けます。
Lambda
次のようなスクリプトでLambda関数(今回はTaggingWhenS3Bucket
という名前)を作成します。Python 2.7で動作します。
from __future__ import print_function
import boto3, botocore
def lambda_handler(event, context):
region = event[u'detail'][u'awsRegion']
bucket_name = event[u'detail'][u'requestParameters'][u'bucketName']
client = boto3.client('s3', region_name=region)
try:
client.get_bucket_tagging(
Bucket=bucket_name
)
except botocore.exceptions.ClientError as e:
client.put_bucket_tagging(
Bucket=bucket_name,
Tagging={
'TagSet': [
{
'Key': 'Project',
'Value': 'AAAAAA'
},
]
}
)
Key: Project
、Value: AAAAAA
は付与するタグセットですので任意のタグセットに変更しておきましょう。
また、Lambda関数に紐付けるIAMロールに次のような権限を付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LoggingCloudWatchLogs",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Sid": "TaggingS3Bucket",
"Effect": "Allow",
"Action": [
"s3:GetBucketTagging",
"s3:PutBucketTagging"
],
"Resource": [
"*"
]
}
]
}
CloudWatch Events
CloudWatchのマネジメントコンソールにアクセスし、「ルール」をクリックし、「ルールの作成」をクリックします。 図のようにイベントを設定し、ターゲットに先ほど作成したLambda関数を指定します。
検証
実際にS3バケットを作成してタグが付与されたか確認してみてください。タグが付与されるのには5分程度のタイムラグがあります。 もし、付与されていない場合はCloudWatch Logsを見てエラーが出ていないかを確認してみてください。
最後に
CloudWatch Events とAWS Lambdaを組み合わせることで、EC2インスタンスなど実行サーバを用意しなくても、S3バケット作成時に自動的にタグを付ける方法を紹介しました。 今回はS3バケット作成時のみでしたが、他のリソースにも応用できますのでぜひ色々試してみてください。