この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
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,...},
{...}|...]]}]}
はい、できました!
まとめ
このerlcloudを使って、なんとElixirでもAWSをコントロールできるそうです!(Accessing the Amazon AWS from Elixir (using erlcloud))
今度は是非Elixirも試してみたいです!