2012-07-25

IAM roles for EC2 instancesを使ってみた

EC2インスタンスのIAMロールとは?
  • 今までIPアドレスで利用範囲を絞っていたところを、このEC2インスタンスから!みたいな制約で利用できるようにする機能
  • aws-sdkを使えばcredentials周りのコードを簡略化できる
制約とか
  • roleは、EC2インスタンス起動時に選択することができる
  • roleは1つしか割り当てられない
  • 既存のインスタンスにはroleを割り当てることはできない
  • 既にroleが割り当てられているインスタンスからroleを外すことはできない
  • roleのPermissionsの変更は即時反映される
roleの作成
AWS ConsoleのIAMのところからCreate Roleをクリック
roleの名前を入力してContinue
適当なPolicyをSelect(後から編集もできるのでてきとーに)
Policyの名前を決めて、Policy Documentを確認したらContinue
内容を確認して問題なければCreate Role
はい、出来上がりましたヾ(*・ω・)シ
あとは、作成したroleを割り当ててインスタンスの起動
通常通りインスタンス起動のウィザードを辿っていくとInstance DetailsのところでIAM Roleの選択肢がでてくるので先ほど作成したroleを選択

起動を待っている間に、s3バケットのURLを一覧表示するようなサンプルプログラムの作成
通常版
#! /usr/bin/ruby
require 'rubygems'
require 'aws-sdk'

my_access_key_id = 'xxxxxxxxxxxxxxxxxxxx'
my_secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

AWS.config({
  :access_key_id => my_access_key_id,
  :secret_access_key => my_secret_key
})

sts = AWS::STS.new()
session = sts.new_session()
#puts "Session expires at: #{session.expires_at.to_s}"

#s3 = AWS::S3.new(session.credentials)

for bucket in s3.buckets
 puts bucket.url
end
てな具合で見慣れたCredentials周りのコードを書く訳ですがIAM roles for EC2 instances版だとここを省くことができます
#! /usr/bin/ruby
require 'rubygems'
require 'aws-sdk'

s3 = AWS::S3.new()

for bucket in s3.buckets
 puts bucket.url
end
と、こんな単純に。
実行結果はどちらも同じように
./list_s3_urls.rb
http://bucket1.s3.amazonaws.com/
http://bucket2.s3.amazonaws.com/
http://bucket3.s3.amazonaws.com/
みたいな感じで表示してくれます
aws-sdkを利用しない場合はcurlを使って
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role1
{
  "Code" : "Success",
  "LastUpdated" : "2012-07-25T04:43:21Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "xxxxxxxxxx",
  "SecretAccessKey" : "xxxxxxxxxx",
  "Token" : "xxx",
  "Expiration" : "2012-07-25T11:15:42Z"
}
みたいに最後の/の後にEC2インスタンスに割り当てられたroleの名前を入れてあげれば、一時的に利用できるAccessKeyIdとSecretAccessKeyを含むレスポンスが得られるのでこれを利用すれば良いみたいです。

0 件のコメント:

コメントを投稿