AWSにALBサーバを立てる

Post date: 2017/08/25 15:45:37

[時刻UTC→JST]

# timedatectl set-timezone Asia/Tokyo

[AWSの立ち上げ]

1.まずは無料ではじめる

サインイン

いつものパスワードでアカウント作成、連絡先情報を入力、支払いはANAカードを使用

携帯電話に本人確認がくるので4桁のPIN番号入力

サポートプラン: ベーシック

アカウント準備できたら、emailが来る。開始方法をクリックすると10分間チュートリアル

2.コンソールへログイン

email/いつものパスワードでログイン

仮想マシーンの起動: EC2インスタンスを今すぐ始める

EC2インスタンスの名前の指定: anagix1

(なぜかわからんが、米国東部(オハイオ)リージョンになってる!)

オペレーションシステムの選択: 今回はUbuntu Server 16.04 LTSにしてみる

インスタンスタイプ: 無料のt2.micro (1 コア vCPU (最大 3.3 GHz)、1 GiB メモリ RAM、8 GB ストレージ)

プライベートキーをDropbox/MinimalFabに保存

3.このインスタンスを作成を実行

EC2コンソールに進む

インスタンスへの接続は、接続タブをクリックすると表示される

インスタンスの状態が、初期化しています、2/2のcheckに合格しました、にかわった

4.SSHでアクセスする

そのままでは入れなかったので、セキュリティグループのインバウンドのルールを自分のグローバルIPのみに変更した

[chefとかインストール]

1.emacs

2.curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P chefdk -c stable で、chefdk 2.1.11-1がインストールされた

Rubyのバージョンは、2.4.1p111すげえ。RAILSとHoboが大丈夫かやや心配

3.chef-client --local-modeを試してみる

参考: https://learn.chef.io/modules/learn-the-basics/ubuntu/aws/set-up-a-machine-to-manage#/

ここまでで、ディスク使用量 22%

[RDS (mysqlサービス)]を使う

コンソールから、すべてのサービスを展開表示し、RDSを選択

”今すぐはじめる”で、MySQL-compatible editonを選択

本番稼働用か、開発/テスト用を選択できるが、無料枠はの開発/テストを選び、次のステップ

インスタンスの仕様は、無料枠では以下のようになる:

(無料利用枠では、ングルの db.t2.micro インスタンスと 20 GB までのストレージを提供しています)

DBインスタンスのクラス: db.t2.micro - 1v CPU, 1GIB RAM

マルチAZ配置: いいえ、しか選べない

ストレージタイプ: 汎用(SSD)しか選べない

ストレージ割り当て: 5 GB

以下のように設定

DBインスタンス識別子: albdb

マスターユーザの名前: anagix

マスターパスワード: anagixalb

パスワードの確認: 同じのを入れる

[詳細設定]の設定

ネットワーク&セキュリティ(変更不可)

VPC: デフォルトVPC(vpc-63d2fe1a)

サブネットグループ: default

パブリックアクセス可能: はい

アベイラビリティ-ゾーン: 指定なし

VPCセキュリティグループ: default(VPC)

データ・ベースの設定

データ・ベースの名前: alb_production

データ・ベースのポート: 3306

DBパラメータグループ: default.mysql5.6

オプショングループ: default.mysql5.6

タグをスナップショットへコピー: チェックせず

IAMのDBパラメータ認証を有効にする: 指定なし

暗号を有効化: いいえ

バックアップ

バックアップの保存期間: 7日

バックアップウィンドウ: 指定なし

モニタリング

拡張モニタリングを有効にする: いいえ

メンテナンス

マイナーバージョン自動アップグレード: はい

メンテナンスウィンドウ: 指定なし

以上で、DBインスタンスの作成

DBインスタンスの表示をクリックすると、DBインスタンスの起動状況が表示される

ステータスは、作成中から、更新ボタンで、バックアップ中に変わった

[mysql-clientのインストール]

apt-get install mysql-client (これでディスクは25%)

[RDBへの接続]ここまできたところで、やりなおすことにした。

理由: 1.リージョンがでたらめ、やはりASIA・Tokyoで作り直したい

2.順序として、VPCをつくり、そのなかにRDS,EC2という順序にすべきだった。

なので、以下やりなおし。

1.EC2の移動

インスタンスのコンソールで、アクション→イメージ→イメージの作成

2.RDSコンソールで、米国東部(北部バージニアに作ってしまった)DBインスタンスを削除

3.世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまでにしたがって、

VPCの作成

CIDRは、172.31.0.0/16になってしまって、編集できないので、このままで行く

サブネットの作成

名前タグ: anagix

VPC: vpc-8f351ceb

VPC CIDR: 172.31.0.0/16

アベイラビリティゾーン: ap-northeast-1a を選択

IPv4 CIDRブロック: 172.31.0.0/24

インターネットゲートウェイ

albgwという名前で、作成し、VPCにアタッチ

ルートテーブル

すでにrtb-6d9c4d0a というルートテーブルIDが存在するので、サブネットの関連付けを編集

送信先を 0.0.0.0/0、ターゲットを作成したalbgwにして保存

セキュリティグループの作成

名前タグ: anagixで作成 グループ名:anagix

インバウンドのルール

4.RDSをMySQLで作成

今回は、Ubuntu 16.04のmysql-clientが5.7なので、5.7.17を選ぶ

DBインスタンス識別子: albdb

マスターユーザの名前: rootに変更

マスターパスワード: anagixalb

データ・ベースの名前: alb_production

ここで、DBインスタンスの起動エラー

DB Subnet Group doesn't meet availability zone coverage requirement. Please add subnets to cover at least 2 availability zones. Current coverage: 1 (Service: AmazonRDS; Status Code: 400; Error Code: DBSubnetGroupDoesNotCoverEnoughAZs; Request ID: b9a3e7da-8a51-11e7-9fec-dfe649870939)

対策として、subnetを追加すればOKだった

アベイラビリティゾーン: ap-northeast-1c

IPv4 CIDRブロック: 172.31.1.0/24

5.EC2の作成

今回は、1で作成したイメージをまず、AMIで、Asia(Tokyo)にリージョン移動する。

リージョン表示をかえると、新しいAMI IDが表示され、状態は pending

新しいインスタンスを作成する際、イメージをMyAMIから選ぶ

注意: 自動割り当てパブリックIPを、”有効化”にすること (これはここでしか出来ない)

6.EC2へのログイン

chmod 400 anagix1n.pem

ssh -i "anagix1n.pem" ubuntu@ec2-13-114-3-219.ap-northeast-1.compute.amazonaws.com

7. MySQLの接続

セキュリティグループ(Created from the RDS management console)というやつのソースを、172.31.0.0/16に変更した

mysql -h albdb.c........amazonaws.com -P 3306 -u root -p で接続できた!

8.ボリューム(EBS)無料枠30Gの追加

コンソールのボリュームから、ボリュームの作成を実行

ボリュームのアタッチ

作成したボリュームを選択し、アクション→アタッチ

インスタンスは、調べなくても自動的に探してくれる

デバイスが、/dev/sdf と表示された。

こんな注が: ここで入力された (および詳細情報に表示される) デバイス名が /dev/sdf から /dev/sdp であっても、新しい Linux カーネルによっては内部でデバイスの名前が /dev/xvdf から /dev/xvdp に変更されることがあります。

EC2のインスタンスで、lsblkを実行すると、xvdfが増えていることが確認できた。

mkfs -t ext4 /dev/xvdf の後、 mount /dev/xvdf /usr/local/anagix_tools

9.セキュリティグループの変更

ネットワークインタフェースのセキュリティグループはlaunch-wizard-2というもので、22からのみIN BOUNDを許す設定だった

(このままでは80でアクセスできない)

コンソールからネットワークインタフェースに行き、ap-northeast-1aリージョンのセキュリティグループを、最初に3で作ったanagixに変更した

混乱を避けるため、不要になったセキュリティグループを削除した

10. swapの作成

https://sys-guard.com/post-11945/ にしたがって、fallocateを使ってswapをつくる

【chef-client local-modelを使ったALB2サーバインストール】

1.sudo chef-client -z -j ./roles/alb2_server.json

でロールを実行できる。ロールの記述は以下のjson

{

"name": "alb2_server",

"description": "ALB2 server",

"chef_type": "role",

"json_class": "Chef::Role",

"default_attributes": {

},

"override_attributes": {

},

"run_list": [

"recipe[screen]",

"recipe[anagix_init]",

"recipe[openssl]",

"recipe[alb2_install]",

"recipe[git]",

"recipe[gyazo]",

"recipe[alb_db_bkup]",

"recipe[my_apache2_for_alb2]"

]

}

2.recipeの更新

過去に作成したrecipeにはREADME.mdのないものなどあり、そのままではchefの実行でエラーになる

例えば alb2_installの場合、以下のように再度generateすれば、テンプレートのファイルが作成される

chef generate cookbook cookbooks/alb2_install

berkshelfの使い方

~/chef-repo に以下のBerksfileを作成し、berks vendor cookbooksを実行する

source "https://api.berkshelf.com"

cookbook 'git', '~> 4.5.0'

cookbook 'runit', '> 0.13.0'

cookbook 'openssl'

3.cookbooksの修正

・gitをrecipeから外した: どうしてもundefined method `set' for Chef::Platform:Classというエラーが取れない

https://github.com/chef-cookbooks/git/issues/119にしたがい、gitを6.0.0にupdateしてもダメ

・cookbooks/anagix_init/templates/defaultから、.gitconfig, .screenrcなどが欠落していたので復活(原因不明)

・cookbooks/anagix_init/attributes/default.rbに、default['anagix_home'] = '/home/anagix' を設定

・passwdファイルが定義されてないというので、anagix_init/files/passwd を作る(こんなの初めて!)

注意: attributes/default.rb~ が残っていると、以下のようなエラーが発生する

Recipe Compile Error in /home/ubuntu/.chef/local-mode-cache/cache/cookbooks/alb2_install/attr\ ibutes/default.rb~

4.gem、Gemfileの修正

ruby2.4にしたために、Railsを4.2.9、Hoboを2.2.5にした。

5.mysqlデータ・ベースのコピー

RDSとはいえ、基本的にかわらない。sqlをmysqldumpで作成しておき、EC2のインスタンスから

mysql -h xxx -u root -p alb_production < sqlファイル で、作成する。かなり遅かった。

6.Bundle execで起動できるまで

・rake assets:precompileを実行し、app/views/taglibs/auto以下を生成

Railsで"Sorry, you can't use byebug without Readline."のエラーが出た時の対処法 に書いてあるようにGemfileに

gem 'rb-readline'

を入れる必要があった

・ActionView::Template::Error (undefined method `assets_precompile='というエラーは、Gemfileで、sprockets-railsの2.3.3縛りと、respondersの2.1.0縛りを削除し、bundle updateすると解消した。

respondersは、2.1.0のままじゃないと、"protected method `render' called for #<[controller name]>"の

エラーになった(参考: https://groups.google.com/forum/#!topic/hobousers/8j9kCBAaqI4 )

7.起動はしたものの、不具合対策

config/environments/production.rb で以下のオプション変数の名称を_assetsから_filesに変更する必要があった。(Rails4.2で変更になっていた)

config.serve_static_files = true

ここで、rails 4.2.8で、Ruby 2.4に対応したことが発覚(http://www.softantenna.com/wp/software/rails-4-2-8/)

Ruby2.4+Rails4.2.9+Hobo2.2.5への移行を試みたが、どうしてもapp/views/projects/show.drymで、以下のエラーになる。

ActionView::Template::Error (The asset "changetab.js" is not present in the asset pipeline.)

changetab.jsは、public/javascripts/changetab.jsに置いているにもかかわらずchangetab.jsをass/javascriptから

探そうとしているように見える。gem 'sprockets-rails', '2.3.3' のバージョン指定を外すと、3.2.0が入ったので

原因はそれかも知れない。

Ruby2.4+Rails4.2.9+Hobo2.2.5+sprockets_rails2.3.3を試みるも、以下のエラーになる。

ActionView::Template::Error (undefined method `assets_precompile=' for #<#<Class:0x00000009ff\

a830>:0x007f6274d84c70>

ほとんどあきらめたが、sprockets-railsを3.1.0にすると動いた。

Ruby2.4+Rails4.2.9+Hobo2.2.5+srockets-rails3.1.0でしばらく動かしてみる。

[ALBサーバの立ち上げ]

1.8180/8183ポートを使うよう /etc/apache2/sites-available/000-default.confを変更

2.a2enmod rewrite でモジュール追加

RewriteEngine on

RewriteRule ^(.*)$ https://aws.anagix.com:8183$1 [R,L]

が有効になる。

注意: ロードバランサーでは、Rewriteが80/443では問題ないのに、8180/8183では正しく動作せず、loginの際などに、以下のエラー

400 Bad request: "You're speaking plain HTTP to an SSL-enabled server port."

phusion/passengerにすれば8180/8183でも正しく動作する。

3. Phusion/passngerのインストール

apt-get install passengerすると、/usr/bin/rubyも入ってしまうが、これは避けられないと諦める。

Railsで使うRubyを指定するために、PassengerRuby /opt/chefdk/embedded/bin/ruby の記述が

必要だが、これを8183側でなく8180側に書いたのでハマる。

Apache2.4で、アクセス制限の記述方法が変更されていたにかかれているように、apacheが2.2から2.4で、アクセス許可設定の方法が変わっている

You don't have permission to access / on this serverというエラーがでたので、とりあえず、<Directory />に対し、Require all granted した。