AWSにALBサーバを立てる

2017/08/25 8:45 に 森山誠二郎 が投稿   [ 2017/08/31 8:06 に更新しました ]
[時刻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インスタンスを削除
 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 した。

Comments