はじめに
AWSを運用していると、本番環境、staging環境、テスト環境など色々な環境が増えてきます。
その時、
- テスト環境などの特定の複数のInstanceSetはボタンひとつで stop/start したい
- だけど、万が一にも本番環境にそういう影響が無いようにしたい
ということがなきにしもあらずかと思います。
そういう場合「特定のTagをもつInstanceのみStop/StartできるIAMユーザ」というのを作ることで実現するという方法があります。
方法
IAMの設定
こんな感じのPolicyをもつIAMユーザを作成します。
- 任意の EC2 Instanceを検索することができる
- EC2のTagが Key= TAGTEST, Value= YES のInstanceに対してのみ Stop/Start/Reboot ができる
という設定になっています。当然Tag条件などは自由に変更可能です。
policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowDescribe",
"Effect": "Allow",
"Action": [
"ec2:Describe*"
],
"Resource": [
"*"
]
},
{
"Sid": "AllowStartStop",
"Effect": "Allow",
"Action": [
"ec2:RebootInstances",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Condition": {
"ForAnyValue:StringEquals": {
"ec2:ResourceTag/TAGTEST": "YES"
}
},
"Resource": [
"arn:aws:ec2:*"
]
}
]
}
テスト
上記のIAMユーザの Key/Secret を使って、Name が my_project のInstanceをstopするテストです。
このInstanceに TAGTEST=YES を付けた時とつけていない時で動作が変わることが確認できます。
require 'rubygems'
require 'aws'
AWS_ACCESS_KEY_ID = 'MYKEY'
AWS_SECRET_ACCESS_KEY = 'MYSECRET'
ec2 = AWS::EC2.new(
:access_key_id => AWS_ACCESS_KEY_ID,
:secret_access_key => AWS_SECRET_ACCESS_KEY,
:region => 'ap-southeast-1',
)
yy = ec2.instances.tagged('Name').tagged_values('my_project').first
yy.stop