AWS IAMのAssumeRole APIで東京リージョンのエンドポイントを利用する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2015/02/24更新 : aws stsのエンドポイント指定方法がAWS CLIバージョン1.7.11で変更されたので、反映しました。

ども、大瀧です。
本日AWS Security Token Service(STS)に全リージョンのエンドポイントが追加されました。STSで最も身近に利用するAPIがAssumeRoleだと思いますので、AssumeRoleを呼ぶ場合の様子をレポートします。

事前準備

既定では、STSのリージョン毎のエンドポイントは無効になっており、リージョン単位で有効化が必要です。無効の状態だと、以下のようにエラーになります。

$ aws sts assume-role --role-arn arn:aws:iam::XXXXXXXXXXXX:role/exc_web --role-session-name temp \
  --region ap-northeast-1 --endpoint https://sts.ap-northeast-1.amazonaws.com
A client error (AccessDenied) occurred when calling the AssumeRole operation: STS is not activated in this region for account:XXXXXXXXXXXX. Your account administrator can activate STS in this region using the IAM Console.
$

AWS Management ConsoleのIAM管理画面にある[Account Settings]に[Security Token Service Regions]という項目があるので、この一覧から有効化したいリージョンの[Activate]リンクをクリック、[Activate Region]ボタンをクリックして有効化完了です。

sts-regions01 sts-regions02

動作確認とレスポンス速度の計測

では、動かしてみましょう。上記コマンド例で一度実行済みですが、AWS CLIの場合は--regionオプションと--endpointオプションでそれぞれ希望のリージョンとリージョンごとのエンドポイントを指定します。STSのエンドポイントはsts.<リージョン名>.amazonaws.comです。

$ aws sts assume-role --role-arn arn:aws:iam::XXXXXXXXXXXX:role/exc_web --role-session-name temp \
  --region ap-northeast-1 --endpoint https://sts.ap-northeast-1.amazonaws.com
{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAJ2RELZSC7YNIPL6WI:temp",
        "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/exc_web/temp"
    },
    "Credentials": {
        "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "SessionToken": "AgoGb3JpZ2luEDIaDmFwLW5vcnRoZWFzdC0xIoACpaAELe5RHxJLoBl2G4Q56SHv5hIctAMSCGinBiiO7bCYCzmqkDyXR058g5Dja3WpeEqbUtjdQP5JqoYX7iTbr/GxdoRFobvlHb6I05LxqyccuQ5mhbah/s/V2QEW9MhamxrX3HVRF6DoA9nYGcb/Bg/FLy3RKVUi9gc62Oh7kU6SU2dkZCONFVzy/c4e4HiraUt4tUuyuxRAls4WqeYKnSUVIS8WbW7zynWpQPVsRqd8bhvpcUy/+m78Ag8Q4mRDbHFJjuq1e31LA6qfspfkr4czCRjWc/jj1P7ApLboCYsTYiK5N25fGAG2hrDyV441s1OkyASANhq9//rOhIGIgSrnAQg3EAAaDDYwMjYwNDUwNjY4MCIMa/FXOLMH+zzyduAQKsQBjC23Or84mJFMwX2hgf+rFOKdSQKr2utE+kgBkrtftaXgqMUBMOjpEk/bIuZFzFTdVLK1cxTgfE6k1/mwXJF0mVDumQLPHxuaSHEcSxDkisJU9H/3Mz3CuP1IejXsRdmgmLAyhIyK+ci9UpuWX9qp0TXEyPWQXwT2YyDvlCcbqcgqrZKUVlHteSRbBYYNY+wfjbNGWvL4RVoJQ6rdX99X4v5YCWnt9aDNWxg8wuV96R+AyAiR67nG3y6GpyWwW5etSgqM4jCY9I6nBQ==",
        "Expiration": "2015-02-17T22:15:56Z",
        "AccessKeyId": "XXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

一時キーが取得できましたね!機能自体は従来のエンドポイントと変わらないので、リージョン毎のエンドポイントを利用するメリットは、地理的に近いことからレスポンス速度の向上にあると思います。そこで、aws sts assume-roleコマンドの実行時間を計測してみました。まずは新機能の東京のエンドポイントに。

$ time aws sts assume-role --role-arn arn:aws:iam::XXXXXXXXXXXX:role/exc_web --role-session-name temp \
  --region ap-northeast-1 --endpoint https://sts.ap-northeast-1.amazonaws.com
{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAJ2RELZSC7YNIPL6WI:temp",
        "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/exc_web/temp"
    },
    "Credentials": {
        "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "SessionToken": "AgoGb3JpZ2luEDIaDmFwLW5vcnRoZWFzdC0xIoACek+jc08JknUwqrW0GsW+aFO7rHIwFwfoQG4gzzzX9+595U0kX/lm9/MyFF2SwT4gq9SzCzaDWnM3FPXpIcfWixWh6zngggX/adCydtWcLitbGI9Gqk+FhS1lktYYw0D2CcQoBrQ81oI60TkpNXL/T8AilTkY0BihNVAJXc5lR+2X9WkIvVijyXSZu/OeoTagIjn8gtitUnpqbqk1WX0U55TpoJb6cMqxUlhj3sPx/1/8OlLlGm+egixUoNM1tyL2BR4nxU0hDYvCEtgeZ5+8fVKNOxNvMjcKbjUFUBakxgtdY0D6WdWGKSRlO8PCJo6fjZ7YjOzI4Fy8TmML8+3BHirnAQg3EAAaDDYwMjYwNDUwNjY4MCIMbOCw6gvhVgD1piyVKsQBafLOSUjYbB3pD+mbiaKGvhXX+bp/7lp+2KpzVnGCohLww6LtERdGeEBXtWUDrhux6SGbcz8BY4gMb//Inyne/0pQfvisxFE01GB44FxYO6aY6KSQV6y/LSKHfeLC0l9Qh1vbpMvq7hwgPldFg2SoO656GuI4AukC7frmYDDEVxADrWUu7ClS9R3ojljGhKwPw5N9ERrUDdOUJRH5MUQvbTsEAapLhM68IRgvRzusw5yolinM8NYzx5WiSZXoYE1y06e2JzCr9I6nBQ==",
        "Expiration": "2015-02-17T22:16:15Z",
        "AccessKeyId": "XXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

real	0m0.384s
user	0m0.200s
sys	0m0.054s

続いて、従来から利用できたグローバルのエンドポイントに。

$ time aws sts assume-role --role-arn arn:aws:iam::XXXXXXXXXXXX:role/exc_web --role-session-name temp
{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAJ2RELZSC7YNIPL6WI:temp",
        "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/exc_web/temp"
    },
    "Credentials": {
        "SecretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "SessionToken": "AQoDYXdzEDcagAIieNzLIAUcFNC9bDQtX7FI6UJI+9+ooJChkbQaqSTJF6ajvdtIYTEHlRy4FSwGN119b9foB5XdUHX/askpkb7OHyrr4O5JX9kHEyeImXLTzM1RtJRp9asLZ/u8loLroQabZoBDCNZ536GMDc3pQoyqVkE/FJaogAG4hcJeKz7AEmx2hfZ3J59z7v9iU3DJCpQGJHGcNfvQHAaMWX9bgSkMnCAGxekIHIiLiPQ0J9l9rG5Cu+nbvKAMPRvCHRueTknd+Lf03Gpm7YYtmPLc99kfMTTIXPzl//k7IXaIqT5IS98KDzZ8c6/hTs0F9wLPpzTMP3Q+qp8tWldKM11QReCtIL70jqcF",
        "Expiration": "2015-02-17T22:16:34Z",
        "AccessKeyId": "XXXXXXXXXXXXXXXXXXXXXXXX"
    }
}

real	0m3.319s
user	0m0.195s
sys	0m0.050s
$

リージョンのエンドポイントの方が7倍速いですね!

まとめ

AssumeRole APIで東京リージョンのエンドポイントを利用する手順をご紹介しました。元々アプリケーションからAssumeRoleで一時キーを取得する処理は、繰り返しの利用を想定してアプリケーション内でキャッシュする使い方が一般的です。しかしながらエンドポイントを変更するだけで初回取得のパフォーマンスアップが図れるのであれば、積極的に活用していきたいところですね!

ちなみに、EC2のIAMロールで取得する一時キーはVPCのメタデータサーバーから提供されるため、本エンドポイントは利用できません。

参考