EC2上からAPIを実行する際には、アクセスキー、シークレットキー等を設定するのですが、下記の発表により、よりシンプルかつ安全に実現できるようになりました。

【AWS発表】IAM roles for EC2 instances – シンプルに安全にEC2からAWSサービスのAPIに
アクセス可能に

今までは、IAMからアクセスキー、シークレットキーを取得し、EC2上に設定ファイル等の形で配置して利用する方法が多かったと思います。
(より安全にするためS3に配置して利用する方法もあると思いますが)

これが上記の機能により、AWSがEC2のメタデータにキーを設定してくれるようになりました。
具体的には下記のように取得することができます。

# curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2
{
  "Code"            : "Success",
  "LastUpdated"     : "2012-06-24T09:01:00Z",
  "Type"            : "AWS-HMAC",
  "AccessKeyId"     : "XXXXXXXX",
  "SecretAccessKey" : "YYYYYYYY",
  "Token"           : "ZZZZZZZZ",
  "Expiration"      : "2012-06-24T15:14:42Z"
}

この機能を利用することには、下記のような利点があると思います。

  • キーをEC2に配置しなくてよくなる → 安全性向上(今までも工夫すればできましたが)
  • キーは1日に複数回自動でローテーション → 安全性向上(自動でない場合、作業が大変)
  • EC2内でキーに依存した操作が不要(ロールの付け直しで対応) → より汎用的に

そこで、実際に試してみます。

まずは、IAMのロール作成です。

ロールの名前を付けます。

そして、ポリシーを選択します。(ここではEC2のフルアクセス)

ポリシーのJSONも確認します。

さらに最終的な確認を行います。

ロールを作成します。

そして、EC2立ち上げ時に、ロールの設定(左下)ができるようになっているので、上記で作成したロールを選択します。

その後、起動したEC2で下記を実行すると、アクセスキー、シークレットキーを取得することができます。
(少し時間がかかります)

# curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2
{
  "Code"            : "Success",
  "LastUpdated"     : "2012-06-24T09:01:00Z",
  "Type"            : "AWS-HMAC",
  "AccessKeyId"     : "XXXXXXXX",
  "SecretAccessKey" : "YYYYYYYY",
  "Token"           : "ZZZZZZZZ",
  "Expiration"      : "2012-06-24T15:14:42Z"
}

さらにAWS PHP SDKで利用してみますが、簡単に下記のようなコードで実現できます。

# cat test
 "/tmp"));
$ec2->set_region(AmazonEC2::REGION_APAC_NE1);
$response = $ec2->describe_instances();
var_dump($response->isOK());
?>
# ./test
bool(true)

注意点として「default_cache_config => /tmp」を指定しないと エラーが発生して、処理が止まってしまいました。

ちなみに、上記で指定した/tmp以下を確認してみると、

# ls /tmp/
instance_profile_credentials.cache

のようなバイナリファイルが作成されていました。

もう対応されているかもしれませんが、s3cmd等のアクセスキー、シークレットキーを指定するツールも
対応されると嬉しいです。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら