サーバーワークス カスタマーサポート課 伊藤です。
いつもはZabbixの記事を中心にお送りしておりますが、
今回はEC2への自動タグ付けについてお知らせします。
教育現場や、社内のリソース管理など1つのAWSアカウントを複数人で使う場合、IAMのポリシーでConditionパラメータを指定することで、特定のタグを持ったリソースだけを操作するという手法がよく使われます。
ですが、このタグを付け忘れる事などがよくあります。
そこで今回は、EC2インスタンスを作成したユーザー情報を自動的にタグに設定し、そのそのタグが付いているリソースだけを操作可能とする方法をご紹介します。
この手法は、AWSのSecurity Blogで紹介されているものです。
設定方法
- CloudFormation による展開
CloudFormation template をダウンロードして、CloudFormationの Create stackからアップーロードします。 - CloudFormationによって、設定に必要なリソースが展開されます。
- IAMユーザを作成し、CloudFormationによって作成されたIAMポリシ-を付与するもしくはIAMグループに所属させます。
- IAMユーザでEC2インスタンスを作成します。
- Lambdaにより、自動的にEC2,EBS,ENIにタグが設定されます。
- このユーザでは、自分が作成したEC2以外は操作することができません。自分が作成していないインスタンスを操作しようとするとエラーが返されます。
これで、自分で作成したインスタンスしか操作できないユーザを作成することが出来ました。
中身解説
- IAMポリシー
{
IAMポリシ-ではConditionのなかでuseridを指定して、Stop,Start,Reboot,Terminateを許可しています。
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:Describe*",
"ec2:RunInstances"
],
"Resource": [
"*"
],
"Effect": "Allow",
"Sid": "LaunchEC2Instances"
},
{
"Condition": {
"StringEquals": {
"ec2:ResourceTag/PrincipalId": "${aws:userid}"
}
},
"Action": [
"ec2:StopInstances",
"ec2:StartInstances",
"ec2:RebootInstances",
"ec2:TerminateInstances"
],
"Resource": [
"*"
],
"Effect": "Allow",
"Sid": "AllowActionsIfYouAreTheOwner"
}
]
}
このままですと、インスタンスのリソース状況が確認出来ないので、ポリシーを修正するか、CloudWatchReadOnlyAccessポリシ-を追加されることをおすすめします。 - CloudWatch Event
CloudWatch Eventでは、New-EC2Resource-EventをトリガーにしてLambda関数を実行するように設定されています。 - Lambda関数
Lambda関数はPython2.7で実装されており、Ownerタグ(IAMユーザ名)とPrincipalIdタグ(IAMユーザID)をEC2関連リソースに対して設定するようになっています。
まとめ
AWSのSecurity Blogで公開されているCloudFormation template を利用することで、EC2インスタンスへのタグ付けを自動化することが出来ました。
この設定を利用することで、作成した人だけがEC2を操作できる環境を構築することが出来ます。
ハンズオン環境や、学校など、みんなで同じAWSアカウントを使いながら、他人にEC2を操作されたくない環境などで役に立つのではないでしょうか。
CloudFormation template やIAMロールを修正することで、RDSでも同様の仕組みを構築することもできます。
なお、CloudFormation template の権限では、セキュリティグループを編集することはできないので、
ネットワーク管理者とサーバ管理者が分かれているような環境ではさらにおすすめです。