okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

RailsアプリケーションをElastic Beanstalkにデプロイする

前回の記事で簡単なRailsアプリケーションのサンプルを作成しました。
今回はこのサンプルをElastic Beanstalkにデプロイしてみたいと思います。デプロイに必要となるコマンドラインツールなど、環境構築手順は前回の記事に書いてありますので、そちらを参照して下さい。

f:id:okochang:20150714153507j:plain

EB CLIの設定

作成したプロジェクトリポジトリでeb initコマンドを実行して環境設定を行います。

$ cd ~/repos/mimawarigumi
$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) sa-east-1 : South America (Sao Paulo)
(default is 3): 1

Enter Application Name
(default is "mimawarigumi"): 
Application mimawarigumi has been created.

It appears you are using Ruby. Is this correct?
(y/n): y

Select a platform version.
1) Ruby 2.2 (Puma)
2) Ruby 2.2 (Passenger Standalone)
3) Ruby 2.1 (Puma)
4) Ruby 2.1 (Passenger Standalone)
5) Ruby 2.0 (Puma)
6) Ruby 2.0 (Passenger Standalone)
7) Ruby 1.9.3
(default is 1): 1
Do you want to set up SSH for your instances?
(y/n): n

環境設定が完了すると、以下のように.gitignoreが更新されており、.elasticbeanstalk/configが作成されています。
変更点は忘れずにコミットしておいて下さい。

$ git diff
diff --git a/.gitignore b/.gitignore
index cd84d08..a90ebee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,8 @@
 
 # Ignore dotenv
 /.env
+
+# Elastic Beanstalk Files
+.elasticbeanstalk/*
+!.elasticbeanstalk/*.cfg.yml
+!.elasticbeanstalk/*.global.yml
$ ls .elasticbeanstalk/
config.yml
$ git add .gitignore
$ git commit -m "Elastic Beanstalkの設定ファイルを除外するようにした"

AWS Management Consoleでは、以下のようにApplicationが作成されています。

f:id:okochang:20150714215024p:plain

環境作成とアプリケーションのデプロイ

環境作成とデプロイをしていきます。eb createコマンドでタイムアウトしてしまう場合は--timeoutオプションを使ってみて下さい(タイムアウトしても環境作成とデプロイが失敗するわけではありません)。

$ eb create --database --database.engine postgres
Enter Environment Name
(default is mimawarigumi-dev): mimawarigumi-env
Enter DNS CNAME prefix
(default is mimawarigumi-env): 

Enter an RDS DB username (default is "ebroot"): mimawarigumi
Enter an RDS DB master password: 
Retype password to confirm: 
WARNING: Deploying a previously deployed commit.
Environment details for: mimawarigumi-env
  Application name: mimawarigumi
  Region: us-east-1
  Deployed Version: a265
  Environment ID: e-zhkdupp9c6
  Platform: 64bit Amazon Linux 2015.03 v1.4.3 running Ruby 2.2 (Puma)
  Tier: WebServer-Standard
  CNAME: mimawarigumi-env.elasticbeanstalk.com
  Updated: 2015-07-15 00:11:00.587000+00:00
Printing Status:
INFO: createEnvironment is starting.

(略)

---
$ eb setenv SECRET_KEY_BASE=`bundle exec rake secret`

Management Consoleでは以下のようになっています。

f:id:okochang:20150715095204p:plain

動作確認

Management Consoleに書かれているリンクにアクセスするとWebページが表示されます。

f:id:okochang:20150715095336p:plain

環境の削除

環境を削除する場合は以下のコマンドを実行します。

$ eb terminate

あとがき

前回作成したRailsアプリをElastic Beanstalkにデプロイしました。
その他の設定をしたい場合は別途ebコマンドを使ってやって下さい。これをCodePipelineとかと連携出来るのかな?

CentOS7にRailsプロジェクトを作成するまで

たまに簡単なAWSサービスの動作確認とかで、簡単なRailsアプリケーションの開発環境を作るまでの手順がブログにまとまってると(個人的に)便利だなと思うことがあるので、今回はそんな環境を構築する手順を書きます。
パッケージは執筆時点でのバージョンなので、適宜アップデートして下さい。

f:id:okochang:20150714153507j:plain

使用したAMI

CentOS 7 x86_64 (2014_09_29) EBS HVM-b7ee8a69-ee97-4a49-9e68-afaee216db2e-ami-d2a117ba.2 (ami-89634988)
※起動時にIAMロールもセットしています。

aws.amazon.com

基本設定

まず最初に自分自身のユーザーを作成や時間の設定をします。EC2インスタンス起動直後に接続するユーザーはcentosです。

$ sudo -i
# useradd okochang
# passwd okochang
# visudo -f /etc/sudoers.d/okochang
# sudo cat /etc/sudoers.d/okochang
# User rules for okochang
okochang ALL=(ALL) NOPASSWD:ALL
# timedatectl set-timezone Asia/Tokyo
# sed -i -e "s/^ - update_hostname/# - update_hostname/g" /etc/cloud/cloud.cfg
# echo 'rails.okochang.com' > /etc/hostname

作成したユーザーに手元の環境から接続するためのSSH公開鍵をセットしたり、今後使うためにSSHキーペアを作成します。

$ su - okochang
$ mkdir -m 700 .ssh
$ echo 'ssh-rsa your-ssh-key-tesxt-data' .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ ssh-keygen -C rails.okochang.com
$ sudo reboot

SELinuxごめんなさい

$ sudo sed -i -e "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
$ sudo reboot

必要なパッケージのインストール

Railsの環境を構築するために必要なパッケージのインストールと、AWSコマンドラインツールをインストールしておきます。

$ sudo yum update -y
$ sudo yum install -y git emacs gcc make zlib-devel libxml2-devel libxslt-devel readline-devel openssl-devel gcc-c++ curl-devel ruby-devel  vim wget epel-release bzip2 bind-utils nodejs
$ sudo reboot
$ sudo easy_install pip
$ sudo pip install awscli
$ sudo pip install awsebcli

Git

ソースコードの管理にGitを使うので、このへんも設定しておきます。

$ git config --global user.email "okochang@example.com"
$ git config --global user.name "okochang"

Ruby

rbenvを使って、現時点最新の安定版であるRuby 2.2.2をインストールします。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ cd .rbenv/plugins/ruby-build/
$ sudo ./install.sh
$ cd
$ echo 'export PATH=$HOME/.rbenv/bin:$PATH' >> .bashrc
$ echo 'eval "$(rbenv init -)"' >> .bashrc
$ exec $SHELL -l
$ rbenv install --list
$ rbenv install 2.2.2
$ rbenv global 2.2.2

gems

サンプルプロジェクトではBundlerを使ってgemパッケージを管理しますので、インストールします。

$ gem install rbenv-rehash
$ rbenv rehash
$ gem install bundler

PostgresQL

サンプルプロジェクトでデータベースは使う予定はありませんが、PostgreSQLを使えるようにしてます。プロジェクト名をmimawarigumiにする予定なので、ユーザー名に指定しています。

$ sudo yum install -y postgresql postgresql-server postgresql-libs postgresql-contrib postgresql-devel
$ sudo su - postgres
$ initdb --encoding=UTF-8 --locale=ja_JP.UTF-8
$ exit
$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql
$ sudo su - postgres
$ createuser -a -d -P mimawarigumi
$ exit

サンプル用のRailsプロジェクト作成

プロジェクト用のディレクトリを作成して、railsコマンドでプロジェクトを初期化します。
初期化したら、現時点の内容をコミットします。以降の作業は適宜コミットしていくものとします。

$ mkdir -p repos/mimawarigumi
$ cd repos/mimawarigumi
$ bundle init
$ sed -i -e 's/# gem "rails"/gem "rails"/g' Gemfile
$ bundle config build.nokogiri --use-system-libraries
$ bundle install --path vendor/bundle
$ bundle exec rails new . -d postgresql --skip-test-unit
$ bundle exec rake db:migrate
cat << EOF >> .gitignore

# Ignore ruby version configuration.
/.ruby-version

# Ingonre bundled contents.
/vendor/bundle

# Ignore sass cache
.sass-cache

# Ignore dotenv
/.env
EOF
$ git add .
$ git commit -m "initial commit"

静的ページの作成

静的ページの作成をしていきます。最初にGemfileにrspecとcapybaraを追加してインストールしておきました。具体的な変更内容はこちらを見て下さい。

$ vim Gemfile
$ bundle install --path vendor/bundle
$ bundle exec rails generate controller StaticPages home --no-test-framework
$ bundle exec rails generate rspec:install
$ bundle exec rails generate integration_test static_pages
$ vim app/views/static_pages/home.html.erb 
$ vim spec/rails_helper.rb
$ vim app/views/static_pages/home.html.erb 
$ vim config/routes.rb
$ vim config/database.yml

あとがき

簡単なRailsアプリのサンプルが出来ました。
普段GitHubを使っていることもありCodeDeployとかCodePipelineとかもGitHub連携で試してみたいのです。そういう時にこういうサンプル用のアプリを持っておくと便利かなと。

AWS CodeCommitのリポジトリにSSHでアクセスする

前回のブログAWS CodeCommitを触ってみました。その時作成しGitたリポジトリへはHTTPSを使ってアクセスしましたが、今回はSSHを使ったやり方をまとめます。
ドキュメントにはリポジトリのサイズが大きい場合はHTTPSでなくSSHの使用を検討しましょうって書いてますね。

SSHキーの操作をするIAMポリシーを作成&割り当てる

AWS Management ConsoleでIAMにアクセスし、左メニューからPoliciesを選択します。

f:id:okochang:20150713093955p:plain

ポリシーテンプレートの中からIAMUserSSHKeysを選択し、Attachを選択します。

f:id:okochang:20150713012822p:plain

アタッチしたいユーザーをチェックして、Attach Policyをクリックします(IAMユーザーは事前に作成しておいて下さい)。

f:id:okochang:20150713012919p:plain

IAMユーザーにSSH公開鍵を割り当てる

IAMユーザーにSSH公開鍵を割り当てます。左メニューからUsersを選択します。

f:id:okochang:20150713094125p:plain

割り当てたいユーザーをクリックします。

f:id:okochang:20150713013045p:plain

設定画面のSSH keys for AWS CodeCommitにあるUpload SSH Keyをクリックします。

f:id:okochang:20150713013149p:plain

使いたいSSH公開鍵のテキストデータをペーストしてUpload SSH Keyをクリックします。
SSHの公開鍵と秘密鍵のペアは事前に作成しておいて下さい。

f:id:okochang:20150713013227p:plain

ローカルコンピュータのSSH設定

CodeCommitにSSHアクセスする場合の設定をします。SSH公開鍵をアップロードするとSSH Key IDが付与されます。

f:id:okochang:20150713013339p:plain

CodeCommitのホスト名、付与されたSSH Key ID、秘密鍵のパス、を以下のように設定します。

$ vim .ssh/config
Host git-codecommit.*.amazonaws.com
    User APKAI2EI6HC4N47QBQ3Q
    IdentityFile ~/.ssh/your-ssh-private-key.pem

設定ファイルの権限設定を忘れずにしておいてください。

$ chmod 600 .ssh/config

動作確認

以下のようにSSHで前回のGitリポジトリを手元にCloneできました。

$ git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/SampleRepository

必要に応じて、リモートリポジトリの設定を追加します。

$ git remote add  ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/SampleRepository

感想

普段はGitリポジトリへの接続はSSHを使っているので、個人的にはこっちのほうがしっくりきます。
OpsWorksで起動するEC2インスタンスSSH公開鍵をセットしたり出来ますが、その時の手順とはまったく別物という感じですね。

参考

docs.aws.amazon.com

AWS CodeCommitを触ってみた

久しぶりのブログとなってしまいました。
AWS Summits 2015 | New YorkAWSからいくつかの新サービスがリリースされたようです。新しいサービスはひと通り触ってみたいなと思っておりまして、まずはお手軽に始められそうなAWS CodeCommitから手を付けてみましたのでログを残しておきます。
CodeCommitは、2014年のAWS re:Inventで発表されてから何となくこんなサービスだろうとイメージはしていたものの、理解するには触ってみるのが一番です。

CodeCommitにリポジトリを作成する

AWS Management Consoleにアクセスし、CodeCommitでリポジトリを作成します。
以下のように名前などを指定するだけです。

f:id:okochang:20150712223818p:plain

f:id:okochang:20150712223832p:plain

f:id:okochang:20150712232906p:plain

AWS CLIのバージョンアップ

以下のように手元の環境のAWS CLIをバージョンアップします。特に難しくはありません。

$ sudo pip install --upgrade awscli

AWS CLIの設定

すでに設定済の方はこのステップは必要ありません。認証情報などを以下のコマンドでセットします。

$ aws configure 

gitの設定

次にgitの設定をします。
以下はaws configureコマンドで認証情報のdefaultを設定している場合の例ですが、--profileオプションを使うことも出来ます。
また、特定のディレクトリ以下のみに指定する場合は--localオプションを使用し、gitのデフォルト設定にする場合は--globalオプションを使用して下さい。

$ cd development-repo/
$ git config --local credential.helper '!aws codecommit credential-helper $@'
$ git config --local credential.UseHttpPath true

CodeCommitをGitのリポジトリとして登録する

CodeCommitのダッシュボードからリポジトリを選択します。

f:id:okochang:20150712232951p:plain

リポジトリの詳細画面からHTTPSのアクセス先をコピーしておきます。

f:id:okochang:20150713000134p:plain

以下のようにリモートリポジトリを追加してPushします。

$ git remote add codecommit https://git-codecommit.us-east-1.amazonaws.com/v1/repos/SampleRepository
$ git push codecommit master

感想

何となくGitHubみたいにIssue管理やPRの作成なんかが出来るのかなと予想していましたけど、今時点ではそういった機能はなさそうです。
単純にリモートのGitリポジトリを手軽にホストしてくれるサービスといった感じでしょうか。利用料金はそんなに高くは感じませんでしたので、個人のプライベートリポジトリとしても使えるかも。
他のサービスとの連携で力を発揮するのかなと感じました。

参考

aws.typepad.com

退職しませんでした

こんにちは@oko_changです。
昨日は私の誕生日だったのですが、たくさんのお祝いのコメントを頂き本当にありがとうございます!

毎年この時期はTwitterなどで退職しましたブログや入社しましたブログなどが賑わいます。
そんな私も最近までこっそり転職活動をしていたのですが、最終的に退職しないという決断をしました。
当初転職活動を始めたのは、今までと違った形でインフラエンジニアとして働いてみたいなと思った事がきっかけとなり、この点を転職先に求めていました。
その後、3月中旬くらいに別チーム(サービス開発をしているチーム)の同僚と送別会がてら飲んでるときに、彼のチームで働くというお誘いを受けました。
この提案は考えもしませんでしたし、私がもともと想像していたプランとは少し違いしましたが、自分にとっては良い経験になりそうだし、面白いチャレンジに思えたので、退職しないことを選びました。
退職しないという決断が正しいのかはまだ分かりませんが、この決断を正しくすることは自分にかかっていると思うので、これからしっかり正しい決断に育てていきたいと思います。

転職活動を始めてから、勉強会やコミュニティで知り合った方からのアドバイスを頂いたりしたのは大きな助けとなりました。
また、実際に転職先として考えていた企業で働くエンジニアの方にお話を頂く機会もあり、とても刺激を受けました。
退職の意思を伝えたときに応援してくれた方、引き留めてくれた方、ありがとうございます。

直接お礼をさせていただきたい方がいっぱいいますが、まずはこの場を借りてお礼をさせて頂きます。
これからもよろしくお願いします。

ELBのConnection Drainingの動作をテストする

こんにちは@oko_changです。
先日、ELBののConnection Draining機能がリリースされました。
Connection Drainingの機能については、こちらのブログに参考にして、動作テストはこちらのブログに記載されているように大きなダミーファイルを使えば良さそうです。

環境

リリースノートを見るとAWS CLIはConnection Drainingに対応しているようです。
1.3.2より前のバージョンをご使用の方はsudo pip install --upgrade awscliをして下さい。

テスト環境の作成

まず最初にテスト用のELBを作成します。

$ aws elb create-load-balancer \
--load-balancer-name okochang-elb \
--listeners Protocol=http,LoadBalancerPort=80,InstanceProtocol=http,InstancePort=80 \
--subnets subnet-28f4fd4a \
--security-groups sg-d1e3fcbd \
--region ap-northeast-1

$ aws elb configure-health-check \
--load-balancer-name okochang-elb \
--health-check Target="HTTP:80/index.html",Interval=30,Timeout=15,UnhealthyThreshold=5,HealthyThreshold=5 \
--region ap-northeast-1

次にテスト用EC2インスタンスを作成し、ELBの分散対象に加えます。

$ aws ec2 run-instances \
--image-id ami-b5c0b1b4 \
--security-group-ids sg-b72d31db \
--instance-type t1.micro \
--subnet-id subnet-28f4fd4a \
--private-ip-address 10.0.10.10 \
--key-name okochang-key \
--associate-public-ip-addres \
--region ap-northeast-1

$ aws elb register-instances-with-load-balancer \
--load-balancer-name okochang-elb \
--instances i-3a1f443d \
--region ap-northeast-1

テスト用EC2インスタンスにはWebサーバを構築して、ダミーファイルを作成しておきます。

# dd if=/dev/zero of=tempfile bs=10M count=50

動作確認

Connection Draining有効時

ELBは現在、作成するとデフォルトでConnection Drainingが有効になっています。
先ほどのリリースノートにあるとおりConnection Drainingには対応されているはずですが、describe-load-balancer-attributesを実行してもレスポンスは返ってきませんでした。

$ aws elb describe-load-balancer-attributes --load-balancer-name okochang-elb --region ap-northeast-1
{
    "LoadBalancerAttributes": {
        "CrossZoneLoadBalancing": {
            "Enabled": false
        }, 
        "AccessLog": {
            "Enabled": false
        }
    }
}

というわけで以下はElastic Load Balancing API Toolsを使って動作確認をしています。
先ほど作成したELBのConnection Drainingが有効になっている事が確認出来ます。

$ elb-describe-lb-attributes okochang-elb --region ap-northeast-1 --headers
CROSS_ZONE_LOADBALANCING  CROSSZONE_LOADBALANCING_ENABLED
CROSS_ZONE_LOADBALANCING  false
ACCESS_LOG  ACCESSLOG_ENABLED
ACCESS_LOG  false            
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  false                        300

以下のようにすると秒数を変更したりできます。

$ elb-modify-lb-attributes okochang-elb --connection-draining "enabled=true, timeout=1800" --region ap-northeast-1 --headers
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  true                         1800

それではテスト用のダミーファイルをダウンロードします。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile

ダウンロード途中に以下のようにELBからインスタンスを外してみます。

$ elb-deregister-instances-from-lb okochang-elb --instances i-3a1f443d --region ap-northeast-1 --headers

elb-describe-instance-healthを実行してみると、STATEがInServiceで、DESCRIPTIONがInstance deregistration currently in progress.となっており、ELBから指定された秒数外れるのを待っている状態である事が分かります。

$ elb-describe-instance-health okochang-elb
INSTANCE_ID  INSTANCE_ID  STATE      DESCRIPTION                                     REASON-CODE
INSTANCE_ID  i-3a1f443d   InService  Instance deregistration currently in progress.  N/A

その後、きちんとダウンロードも無事に完了しました。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  500M  100  500M    0     0  2640k      0  0:03:13  0:03:13 --:--:-- 2974k

Connection Draining無効時

次はConnection Drainingを無効にしてテストします。

$ elb-modify-lb-attributes okochang-elb --connection-draining "enabled=false" --region ap-northeast-1 --headers
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  false                        300

以下のようにしっかりと無効になってる事を確認しておきます。

$ elb-describe-lb-attributes okochang-elb --region ap-northeast-1 --headers
CROSS_ZONE_LOADBALANCING  CROSSZONE_LOADBALANCING_ENABLED
CROSS_ZONE_LOADBALANCING  false
ACCESS_LOG  ACCESSLOG_ENABLED
ACCESS_LOG  false            
CONNECTION_DRAINING  CONNECTION_DRAINING_ENABLED  CONNECTION_DRAINING_TIMEOUT
CONNECTION_DRAINING  false                        1800

先ほど外したインスタンスをELBに戻しておきます。

$ elb-register-instances-with-lb okochang-elb --instances i-3a1f443d --region ap-northeast-1 --headers
INSTANCE_ID  INSTANCE_ID
INSTANCE_ID  i-3a1f443d

再度テスト用のダミーファイルをダウンロードします。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile

先ほどと同様にインスタンスをELBから外します。

$ elb-deregister-instances-from-lb okochang-elb --instances i-3a1f443d --region ap-northeast-1 --headers
No instances currently registered to LoadBalancer

今度はすぐにELBから外れました。

$ elb-describe-instance-health okochang-elb
No instances currently registered to LoadBalancer

Connection Drainingを無効時はダウンロードが失敗しました。

$ curl -OL http://okochang-elb-625610288.ap-northeast-1.elb.amazonaws.com/tempfile
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 67  500M   67  337M    0     0  2739k      0  0:03:06  0:02:06  0:01:00 2821k
curl: (18) transfer closed with 170663064 bytes remaining to read

まとめ

無事に期待する動作を確認出来ました。
ELB配下のインスタンスをメンテナンスするときなど、運用時に助かる機能なので重宝しますね。
どうやらすでに作成されているELBはConnection Drainingは無効になってるみたいなのでタイミングを見て有効にしておきたいですね。

その後

AWS CLIでConnection Drainingが使えないなーと悩んでいたら@j3tm0t0さんから以下のようにアドバイス頂きました。



debugオプションをつけてレスポンスが返ってくることと、その後Connection Drainingの情報が取得出来ました!
@j3tm0t0さんありがとうとうございます!

$ aws elb describe-load-balancer-attributes --load-balancer-name okochang-elb --region ap-northeast-1
{
    "LoadBalancerAttributes": {
        "ConnectionDraining": {
            "Enabled": false, 
            "Timeout": 1800
        }, 
        "CrossZoneLoadBalancing": {
            "Enabled": false
        }, 
        "AccessLog": {
            "Enabled": false
        }
    }
}

VPC内のELBが使用しているローカルIPアドレスをEC2インスタンス起動時に指定してみる実験

こんにちは@oko_changです。
VPC内でELBを使用する場合、ELBは指定されたサブネット内のローカルIPアドレスを使用します。
なんとなく気になったので、ELBがローカルIPアドレスを使用した後にそのアドレスを指定してEC2インスタンスを起動した場合の動作を確認してみました。

環境

aws-cli 1.3.2

確認手順

VPCVPCサブネットは事前に作成しておきます。
まず最初に、VPC内でELBを作成します。

$ aws elb create-load-balancer \
--load-balancer-name okochang-elb \
--listeners Protocol=http,LoadBalancerPort=80,InstanceProtocol=http,InstancePort=80 \
--subnets subnet-28f4fd4a \
--security-groups sg-d1e3fcbd \
--region ap-northeast-1

ELBのヘルスチェックを設定します。

$ aws elb configure-health-check \
--load-balancer-name okochang-elb \
--health-check Target="HTTP:80/index.html",Interval=30,Timeout=15,UnhealthyThreshold=5,HealthyThreshold=5

負荷分散対象のEC2インスタンスを起動します。

$ aws ec2 run-instances \
--image-id ami-b5c0b1b4 \
--security-group-ids sg-b72d31db \
--instance-type t1.micro \
--subnet-id subnet-28f4fd4a \
--private-ip-address 10.0.10.10 \
--key-name okochang-key \
--associate-public-ip-addres

ELBに起動したEC2インスタンスを分散対象として設定します。

$ aws elb register-instances-with-load-balancer \
--load-balancer-name okochang-elb \
--instances i-3ebce539

負荷分散対象のEC2インスタンスにWebサーバをインストールし、ELB(10.0.10.17)からアクセスされていることを確認します。

# yum install httpd -y
# vi /etc/httpd/conf/httpd.conf 
# echo "Hello World" > /var/www/html/index.html
# httpd -t
# chkconfig httpd on
# service httpd start
# tail -f /var/log/httpd/access_log 
2014-03-21 23:31:46 JST 340 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:32:16 JST 348 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:32:46 JST 340 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:33:16 JST 338 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:33:46 JST 326 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:34:16 JST 352 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:34:46 JST 324 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:35:16 JST 338 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:35:46 JST 322 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]
2014-03-21 23:36:16 JST 350 10.0.10.17 - [GET /index.html HTTP/1.1] 200 12 [-] [ELB-HealthChecker/1.0]

ELBが使用しているIPアドレスと同じIPを指定して起動します。
やはりIPアドレスが使用中になって起動出来ませんね。

$ aws ec2 run-instances \
--image-id ami-b5c0b1b4 \
--security-group-ids sg-b72d31db \
--instance-type t1.micro \
--subnet-id subnet-28f4fd4a \
--private-ip-address 10.0.10.17 \
--key-name okochang-key \
--associate-public-ip-addres

A client error (InvalidIPAddress.InUse) occurred when calling the RunInstances operation: Address 10.0.10.17 is in use.

ちなみにELBが使用しているネットワークインターフェースの情報も以下のようにdescribe-network-intaerfacesで確認する事が出来ます。

$ aws ec2 describe-network-interfaces --filters Name=description,Values="ELB okochang-elb"

感想

VPC内のローカルIPアドレスを意識しない運用をしている場合は特に問題にならないと思いますが、ローカルIPアドレスに何かしら意味を持たせている場合は注意しておいた方が良いかもしれません。