ErlangでもAWSをコントロール!erlcloudを使ってみた

はじめに

AWSでは様々なプログラミング言語用のSDKが用意されています。Python、Java、Ruby、PHP、.NET、Node.js...たくさんありますね!そして公式で用意されていないプログラミング言語では、多くのデベロッパーがAWSのAPIを操作するライブラリを開発しています。

今日はそんな中の一つ、ErlangでAWSのAPIを操作するerlcloudを使ってみました!

やってみた

セットアップ

僕のローカル環境はMacBook Pro(OS X Yosemite 10.10.3)です。

erlcloudはrebarを使ってビルドできるようになっていますので、brewでrebarをインストールします。

$ brew install rebar

erlcloudをGithubリポジトリから取得します。

$ git clone https://github.com/gleber/erlcloud.git
$ cd erlcloud

ではmakeして動かしてみます。

$ make
$ make run
erl -pa deps/*/ebin -pa ./ebin
Erlang/OTP 17 [erts-6.4]  [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V6.4  (abort with ^G)

とりあえず起動が確認できました。

erlから使ってみる

make runで起動したerl上で操作します。まずはREADMEにある通り、erlcloudをstartさせます。

1> ssl:start().
ok
2> erlcloud:start().
ok

次にAWSアクセスキーとシークレットアクセスキーをセットします。3つ目の引数はEndpointで、東京リージョンを指定しています。

3> erlcloud_ec2:configure("YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "ec2.ap-northeast-1.amazonaws.com").
ok

では、DescribeInstancesを実行してみます。

4> erlcloud_ec2:describe_instances().
{ok,[[{reservation_id,"r-9a0XXXXX"},
      {owner_id,"123456789012"},
      {instances_set,[[{instance_id,"i-59eeXXXX"},
                       {group_set,[[{group_id,"sg-5359XXXX"},
                                    {group_name,"mainte"}]]},
                       {image_id,"ami-18869819"},
                       {instance_state,[{code,16},{name,"running"}]},
                       {private_dns_name,"ip-172-31-XXX-XXX.ap-northeast-1.compute.internal"},
                       {dns_name,"ec2-52-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com"},
                       {reason,none},
                       {key_name,"mykey"},
                       {ami_launch_index,0},
                       {product_codes,[]},
                       {instance_type,"t2.micro"},
                       {launch_time,{{2015,5,14},{2,37,14}}},
                       {placement,[{availability_zone,"ap-northeast-1a"}]},
                       {kernel_id,[]},
                       {ramdisk_id,[]},
                       {monitoring,[{enabled,...},{...}]},
                       {subnet_id,"subnet-c263XXXX"},
                       {vpc_id,[...]},
                       {private_ip_address,...},
                       {...}|...]]}]]}

はい、EC2インスタンスの一覧が取得できました!ちゃんと動いていますね!

スクリプトを書いてみる

それではerlスクリプトを書いて、EC2インスタンスのLaunchをしてみます。aws.erlというスクリプトを作成しました。

$ vi aws.erl
-module(aws).

-include_lib("include/erlcloud.hrl").
-include_lib("include/erlcloud_ec2.hrl").

-export([init_ec2/3,
         create_ec2_instance/0]).

init_ec2(AccessKeyId, SecretAccessKey, Host) ->
  ssl:start(),
  erlcloud:start(),
  erlcloud_ec2:configure(AccessKeyId,
                         SecretAccessKey,
                         Host).

create_ec2_instance() ->
  erlcloud_ec2:run_instances(#ec2_instance_spec{
                               image_id="ami-18869819",
                               instance_type="t2.micro",
                               availability_zone="ap-northeast-1a",
                               key_name="mykey",
                               group_set=["mainte"]
                             }).

このスクリプトを動かしてみます。先ほどと同様にmake runでerlを起動します。

$ make run
erl -pa deps/*/ebin -pa ./ebin
Erlang/OTP 17 [erts-6.4]  [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V6.4  (abort with ^G)

aws.erlをコンパイルします。

1> c(aws).
{ok,aws}

そしてaws:init_ec2により、AWSの認証情報をセットします。

2> aws:init_ec2("YOUR_ACCESS_KEY", "YOUR_SECRET_KEY", "ec2.ap-northeast-1.amazonaws.com").
ok

ではaws:create_ec2_instanceでEC2インスタンスを作成します!

3> aws:create_ec2_instance().
{ok,[{reservation_id,"r-505XXXXX"},
     {owner_id,"123456789012"},
     {instances_set,[[{instance_id,"i-7eeXXXXX"},
                      {group_set,[[{group_id,"sg-535XXXXX"},
                                   {group_name,"mainte"}]]},
                      {image_id,"ami-18869819"},
                      {instance_state,[{code,0},{name,"pending"}]},
                      {private_dns_name,"ip-172-31-XXX-XXX.ap-northeast-1.compute.internal"},
                      {dns_name,[]},
                      {reason,none},
                      {key_name,"mykey"},
                      {ami_launch_index,0},
                      {product_codes,[]},
                      {instance_type,"t2.micro"},
                      {launch_time,{{2015,5,15},{5,59,9}}},
                      {placement,[{availability_zone,"ap-northeast-1a"}]},
                      {kernel_id,[]},
                      {ramdisk_id,[]},
                      {monitoring,[{enabled,false},{state,...}]},
                      {subnet_id,"subnet-c26XXXXX"},
                      {vpc_id,"vpc-8c9XXXXX"},
                      {private_ip_address,[...]},
                      {ip_address,...},
                      {...}|...]]}]}

はい、できました!

EC2_Management_Console

まとめ

このerlcloudを使って、なんとElixirでもAWSをコントロールできるそうです!(Accessing the Amazon AWS from Elixir (using erlcloud))

今度は是非Elixirも試してみたいです!