ようへいの日々精進XP

よかろうもん

今更 VPC で 複数の AZ をまたいだ ELB を試す(2)〜 awscli を使って 〜

はじめに

  • 前の記事VPC を利用して複数の AZ をまたいだ ELB 環境の構築を Management Console を使って行った
  • 今回は同じ環境をコマンドラインツールの awscli を使って構築してみる
  • Management Console から設定するのとどっちが楽かって聞かれると返答に困る...すいません

参考


構築する環境

構築する環境は以下の通り。

f:id:inokara:20131231013817p:plain

インスタンスは前回利用したインスタンスAMI 化したものを利用する。ちなみに、事前に jq をインストールしておくと幸せになれると思います!


やってみよー

awscli を利用するには以下のようなテキストファイルを用意する。

[default]
aws_access_key_id=xxxxxxxxxxxxxxxxxx
aws_secret_access_key=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
region=ap-northeast-1

さらに以下のようにしてテキストファイルを環境変数AWS_CONFIG_FILE に読み込ませる。

export AWS_CONFIG_FILE=${text_file_name}

AMI からインスタンスを起動してみる

インスタンスを起動するあたり以下の情報を手元に用意しておく。(もちろんこれらの情報も awscli で取得しておく)

  • SSH キー の名前
  • セキュリティグループの ID
  • VPC サブネットの ID
  • AMIImageID

SSH キー の名前を確認する

aws ec2 describe-key-pairs | jq '.KeyPairs[].KeyName'

以下のように出力される。

"key1"
"key2"
"key3"

セキュリティグループの ID と関連付いている VPC の ID を確認する

aws ec2 describe-security-groups | jq '.SecurityGroups[]|{GroupId,GroupName,VpcId}'

以下のように出力される。

{
  "VpcId": "vpc-1234567a",
  "GroupName": "quick-start-8",
  "GroupId": "sg-1234567a"
}
{
  "VpcId": "vpc-1234567b",
  "GroupName": "test",
  "GroupId": "sg-1234567b"
}

VPC サブネットの ID を取得する

一発で VPC サブネットの ID をすることが出来なかったので、まずは以下のようにして VPCID を取得する。

aws ec2 describe-vpcs | jq '.Vpcs[]|select(.State="available")|{VpcId,CidrBlock}'

以下のように出力されるので利用する VPCID を確認する。

{
  "CidrBlock": "10.0.0.0/16",
  "VpcId": "vpc-1234567a"
}
{
  "CidrBlock": "10.0.0.0/16",
  "VpcId": "vpc-1234567b"
}

今回は vpc-1234567a を利用するので、以下のようにして VPCID を指定して SubnetIdAvailabilityZone を確認する。

aws ec2 describe-subnets | jq '.Subnets[]|select(.VpcId=="vpc-1234567a")|{SubnetId,AvailabilityZone}'

以下のように出力されるので...

{
  "AvailabilityZone": "ap-northeast-1a",
  "SubnetId": "subnet-1234567a"
}
{
  "AvailabilityZone": "ap-northeast-1a",
  "SubnetId": "subnet-1234567b"
}
{
  "AvailabilityZone": "ap-northeast-1c",
  "SubnetId": "subnet-1234567c"
}

利用したい AvailabilityZoneSubnetId を控えておく。

AMI の ImageID を取得する

aws ec2 describe-images --owners self | jq '.Images[].ImageId'

以下のように AMIImageID が出力される。

ami-xxxxxxxx

必要なパラメータを指定するインスタンスを起動する

ということで、以下のような情報を利用してインスタンスを起動する。

パラメータ
SSH キー の名前 key1
AMIImageID ami-xxxxxxxx
VPCID vpc-1234567a
VPC サブネット(1)の ID subnet-1234567a
VPC サブネット(1)の AZ ap-northeast-1a
VPC サブネット(2)の ID subnet-1234567b
VPC サブネット(2)の AZ ap-northeast-1b
セキュリティグループの ID sg-1234567a
セキュリティグループの名前 test

インスタンスの起動には ec2 run-instances を利用するので以下のように実行する。

aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t1.micro --key-name key1 --security-group-ids sg-1234567a --subnet-id subnet-1234567a --associate-public-ip-address

もう一つ起動する。

aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t1.micro --key-name key1 --security-group-ids sg-1234567a --subnet-id subnet-1234567b --associate-public-ip-address

起動しているインスタンスを確認してみる。

aws ec2 describe-instances| jq '.Reservations[].Instances[]|select(.State.Name=="running")|{InstanceId}'

以下のようにインスタンスID が返ってくる。

{
  "InstanceId": "i-123456a"
}
{
  "InstanceId": "i-789012a"
}

ELB を作成してインスタンスを関連付ける

以下のような情報で ELB を作成する。

パラメータ 備考(パラメータ名)
ELB の名前 hogehuga
所属するサブネット subnet-1234567asubnet-1234567b VPC 内のサブネットを指定
利用するインスタンス i-123456ai-789012a 上記で指定したサブネットに所属するインスタンス
扱うプロトコル HTTP Protocol 又は InstanceProtocol
外部公開ポート 80 LoadBalancerPort
インスタンスでの待受ポート 8080 InstancePort
ELB のセキュリティグループ sg-1234567a --security-groups で指定
ヘルスチェックの PATH HTTP:8080/index.html Target
ヘルスチェックの間隔 30 sec Interval
タイムアウト 5 sec Timeout
インスタンスが停止していると判断するしきい値 2 UnhealthyThreshold / 2 回のチェックでレスポンスが無い場合に停止と判断
インスタンスが稼働していると判断するしきい値 10 healthyThreshold / 10 回のレスポンスチェックで稼働していると判断

ELB を作成する

ELB の作成は aws elb create-load-balancer を使って行う。

aws elb create-load-balancer --load-balancer-name hugahuga --listeners Protocol=HTTP,LoadBalancerPort=80,InstanceProtocol=HTTP,InstancePort=8080 --subnets "subnet-20a89c54" "subnet-7f9acd39" --security-groups sg-1234567a

以下のように DNSName がレスポンスとして返ってくる。

{
    "DNSName": "hugahuga-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com"
}

ELB の細かい設定を行う

更に作成した ELB のヘルスチェック等の細かい設定は configure-health-check を使う。

aws elb configure-health-check --load-balancer-name hugahuga --health-check Target="HTTP:8080/index.html",Interval=30,Timeout=5,UnhealthyThreshold=2,HealthyThreshold=10

以下のようにレスポンスが返ってくる。

{
    "HealthCheck": {
        "HealthyThreshold": 10,
        "Interval": 30,
        "Target": "HTTP:8080/index.html",
        "Timeout": 5,
        "UnhealthyThreshold": 2
    }
}

おお。順調。

ELB にインスタンスを登録する

設定した ELB に対してインスタンスをアタッチ(登録)するには register-instances-with-load-balancer というちょっと長ったらしいサブコマンドを使う。

aws elb register-instances-with-load-balancer --load-balancer-name hugahuga --instances i-123456a i-789012a

以下のようなレスポンスが返ってくる。

{
    "Instances": [
        {
            "InstanceId": "i-123456a"
        },
        {
            "InstanceId": "i-789012a"
        }
    ]
}

とりあえず確認

curlDNSName にアクセスしてみる。

curl http://hugahuga-xxxxxxxxx.ap-northeast-1.elb.amazonaws.com/

最後に

  • リファレンスを片手にチマチマやった感じだと俄然 Management Console の方が楽だった
  • しかし、複数の ELB 環境を構築したりする場合には awscli は絶大な効力を発揮すると思う
  • 事前に必要なパラメータを準備、又は取得出来るようなインターフェースがあれば俄然 awscli の楽だと思う
  • あと、コマンドラインインターフェースを使えば動作の仕組みを理解しながら構築が出来るという点では良いと思う