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,...}, {...}|...]]}]}
はい、できました!
まとめ
このerlcloudを使って、なんとElixirでもAWSをコントロールできるそうです!(Accessing the Amazon AWS from Elixir (using erlcloud))
今度は是非Elixirも試してみたいです!