この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
前回(ErlangでもAWSをコントロール!erlcloudを使ってみた)、ErlangでAWSのAPIを操作するerlcloudを使ってみました。
今回は、Erlangの仮想環境上で動作するプログラミング言語Elixirから、erlcloudを使ってみたいと思います!
やってみた
セットアップ
僕のローカル環境はMacBook Pro(OS X Yosemite 10.10.3)です。
まずはElixirをインストール。brewで一発です。
$ brew update
$ brew install elixir
$ elixir -v
Elixir 1.0.4
プロジェクトを作成する
Elixirのプロジェクト管理ツールであるMixを使って、新しいプロジェクトを作成します。今回はawsという名前にしました。
$ mix new aws
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/aws.ex
* creating test
* creating test/test_helper.exs
* creating test/aws_test.exs
Your mix project was created successfully.
You can use mix to compile it, test it, and more:
cd aws
mix test
Run `mix help` for more commands.
プロンプトに表示された通り、プロジェクトディレクトリに移動して、テストを実行してみます。
$ cd aws
$ mix test
Compiled lib/aws.ex
Generated aws app
.
Finished in 0.07 seconds (0.07s on load, 0.00s on tests)
1 tests, 0 failures
Randomized with seed 141109
問題無く動いてますね。
試してみる
簡単に動作を試してみます。まずプロジェクト定義が記述されるmix.exsを編集し、erlcloudを使うように設定します。また後ほど実行ファイルも作成するのでescript:定義も追加しています。
$ vi mix.exs
defmodule Aws.Mixfile do
use Mix.Project
def project do
[app: :aws,
version: "0.0.1",
elixir: "~> 1.0",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
escript: [ main_module: Aws ],
deps: deps]
end
def application do
[applications: [:logger, :ssl, :erlcloud]]
end
defp deps do
[{:erlcloud, git: "https://github.com/gleber/erlcloud"}]
end
end
getでerlcloudリポジトリを取得します。
$ mix deps.get
そしてcompileによってerlcloudリポジトリの各ライブラリがコンパイルされます。
$ mix deps.compile
事前準備。環境変数にAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYをセットします。
$ export AWS_ACCESS_KEY_ID=<YOUR_ACCESS_KEY>
$ export AWS_SECRET_ACCESS_KEY=<YOUR_SECRET_KEY>
では、ElixirのインタラクティブSheellであるiexから使ってみましょう。
$ iex -S mix
Erlang/OTP 17 [erts-6.4] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Compiled lib/aws.ex
Generated aws app
Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
まずAWSアクセスキーとシークレットアクセスキーを変数として定義します。
iex(1)> access_key_id = System.get_env("AWS_ACCESS_KEY_ID") |> String.to_char_list
iex(2)> secret_access_key = System.get_env("AWS_SECRET_ACCESS_KEY") |> String.to_char_list
次にEC2のエンドポイントを変数として定義します。今回は東京リージョンを指定しています。
iex(3)> ec2_endpoint = 'ec2.ap-northeast-1.amazonaws.com'
上記で定義したAWSアクセスキー、シークレットアクセスキー、EC2エンドポイントをセットします。
iex(4)> :erlcloud_ec2.configure(access_key_id, secret_access_key, ec2_endpoint)
:ok
では、DescribeInstancesを実行してみます。
iex(5)> :erlcloud_ec2.describe_instances()
{:ok,
[[reservation_id: 'r-9a0XXXXX', owner_id: '123456789012',
instances_set: [[instance_id: 'i-59eXXXXX',
group_set: [[group_id: 'sg-53XXXXX', 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',
...snip...
はい、EC2インスタンスの一覧が取得できました!ちゃんと動いていますね!
スクリプトを書いて実行ファイルを作る
それではlib/aws.exを編集します。以下のようにEC2インスタンスをLaunchする内容にしました。
$ vi lib/aws.ex
defmodule Aws do
require Record
Record.defrecord :ec2_instance_spec, Record.extract(:ec2_instance_spec, from: "deps/erlcloud/include/erlcloud_ec2.hrl")
def main(args) do
IO.puts args
access_key_id = System.get_env("AWS_ACCESS_KEY_ID") |> String.to_char_list
secret_access_key = System.get_env("AWS_SECRET_ACCESS_KEY") |> String.to_char_list
ec2_endpoint = 'ec2.ap-northeast-1.amazonaws.com'
:erlcloud_ec2.configure(access_key_id, secret_access_key, ec2_endpoint)
ami = 'ami-18869819'
instancetype = 't2.micro'
az = 'ap-northeast-1a'
key = 'mykey'
spec = ec2_instance_spec( image_id: ami,
instance_type: instancetype,
availability_zone: az,
key_name: key)
:erlcloud_ec2.run_instances(spec)
end
end
mix escript.buildを実行し、実行ファイルを作成します。ここでスクリプトに不備があればコンパイルエラーのメッセージが出力されます。
$ mix escript.build
Compiled lib/aws.ex
Generated aws app
Generated escript aws with MIX_ENV=dev
では出来上がった実行ファイルを走らせてみます!
$ ./aws
はい、できました!
さいごに
今回はSapporo.beamの@niku_nameさんにたくさん質問させて頂きました。ありがとうございました!
Erlangの後にElixirを触ると、確かにElixirのほうがRubyぽさがあって取っ付きやすいですね。こうやって色々なプログラミング言語に触れてみると新しい発見があって楽しいです。今後も新しいツールを見つけたらどんどん試していきます!