AWS Elastic BeanstalkがIAMRoleに対応したようです

2013.04.18

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

aws

はじめに

ついにAWS Elastic BeanstalkでもIAMRoleが使えるようになりました。
これでソースにAccessKeyなどの情報含めなくて良いと思ったら、なんだか安心します。

出たばかりなので、とりあえずIAMRoleが使えていることを簡単に確認してみたいと思います。

IAMの設定

まずはManagementConsoleでRoleを作ります。

新しくRoleを作る

01_create_IAMRole

Roleの名前

02_IAMRoleName

Service Roleの設定

ここにBeanstalkができているのかなとも思ったのですが、おそらくEC2でいいのでは無いかと。

03_Service

Policyの設定

04_Policy

Policyの確認

05_PolicyDocs

Roleの確認

06_confirm

これでIAM Roleの準備はおしまいです。
ここからはElastic Beanstalkで実際に確認してみます。

ManagementConsoleからIAMRoleを設定する。

AWS ElasticBeanstalkでEviromentを作成する際に下の画像のようなInstance Profileを設定するところが出てきています。
ここでIAMRoleを指定することで、立ち上がるEC2に適用されるようです。
実際にはここで設定したInstanceProfileはAutoScalingのLaunchConfigurationに設定されている感じがします。

11_InstanceProfile

[蛇足]ebコマンドでIAMRoleを設定する場合[未検証=>検証済]

もしebコマンドを使って作業している場合は、IAMRoleの設定をするには.elasticbeanstalkの中にあるoptionsettingsに1行追加します
aws.autoscaling:launchconfigurationのところに
IamInstanceProfile=作ったIAMRoleの名前
というのを加えてあげる事で立ち上がるEC2にはIAMRoleが有効になるはずです。
ここは未検証です。ごめんなさい。
検証したら、更新します。

2013/04/18 17:25更新
検証したところ無事にIAMRoleの設定ができている事が確認出来ました。

[aws:elasticbeanstalk:container:php:phpini]
document_root=
composer_options=
zlib.output_compression=Off
memory_limit=256M
allow_url_fopen=On
max_execution_time=60
display_errors=Off

[aws:elasticbeanstalk:application:environment]
PARAM1=
PARAM2=
PARAM4=
PARAM3=
PARAM5=

[aws:elasticbeanstalk:hostmanager]
LogPublicationControl=false

[aws:autoscaling:launchconfiguration]
InstanceType=t1.micro
EC2KeyName=id_rsa
IamInstanceProfile=aws-elasticbeanstalk-ec2-role

[aws:ec2:vpc]
ELBSubnets=
ELBScheme=public
Subnets=
VPCId=

[aws:elasticbeanstalk:application]
Application Healthcheck URL=

[aws:autoscaling:asg]
MaxSize=4
MinSize=1
Custom Availability Zones=

[aws:elasticbeanstalk:monitoring]
Automatically Terminate Unhealthy Instances=true

[aws:elasticbeanstalk:sns:topics]
Notification Endpoint=
Notification Protocol=email

IAMRoleを体感するアプリケーション

まずはアプリケーション(?)を作ります。
今回は下のようなコードを作りました。
SDKを使って現在見えるEC2のインスタンスを表示するという非常に高度なアプリケーションです。

<?php

require_once('AWSSDKforPHP/sdk.class.php');

$ec2 = new AmazonEC2(array(
  'default_cache_config' => '/tmp'
));
$res = $ec2->describe_instances();

echo <<< "HEAD"
<html>
  <body>
    <table>
      <thead>
        <tr><th>instanceId</th><th>instanceType</th></tr>
      </thead>
      <tbody>
HEAD;

foreach($res->body->reservationSet->item as $item) {
  
  echo <<< "TABLE"
  <tr>
    <td>
      {$item->instancesSet->item->instanceId}
    </td>
    <td>
      {$item->instancesSet->item->instanceType}
    </td>
  </tr>
TABLE;
}

echo <<< "FOOT"
</tbody>
</body>
</html>
FOOT;

AWS SDK for PHP

.ebextensions/10_phpsdk.configでは、AWSSDKforPHPを使えるようにインストールするような記述をしておきます。
もしかしたら、最初から入っていて無駄な事かもしれません。

packages: 
  yum:
    php-amazon-sdk: []

 上で作ったindex.phpと.ebextensions/10_phpsdk.configをzipで固めます。
 

 zip -r IAMRoleAppVer1.zip index.php .ebextensions/10_phpsdk.config

 このzipファイルをデプロイすれば完了です。

確認。

ManagementConsoleでEC2のところを開きます。 実際に、今立ち上がったインスタンスを見ると、

21_EC2IAMRole

IAM Roleが設定されている事がわかります。
実際にブラウザでアクセスしてみると、

31_IAMRoleOK

こんな感じでいま起動しているインスタンスのIDとInstanceTypeが表示されました。
もしIAMRoleが適切に設定されていない時は多分500 InternalServerErrorが帰って来るはずです。

最後に

AWS Elastic BeanstalkでIAMRoleが使えるようになったということで、今後デプロイするアプリケーションのソースにはAccessKeyなどの情報を持たなくていいことになります。
gitと相性の良いサービスなので、ソースコードの管理はgithubで思っていたけれど、AccessKeyなどの情報が入ってるから面倒だなと思っていた人には朗報です。
ちょっとした遊びプロジェクトでpublicなrepositoryに入れても安心です。