Post on 27-May-2015
description
Amazon EC2を利用したサーバ構築セミナーの実践報告
それと...AWS SDK for Rubyを使用した
EC2インスタンス管理
@tamochia
K-RubySep. 27, 2012
112年10月1日月曜日
K-Ruby, 15th. September 27, 2012
はじめに
• 「サーバ構築セミナー」とは...- 某大学の某情報系センターにて,毎年,教職員向けにLinuxのサーバ構築,いわゆるLAMP環境を構築して,Web-DBコンテンツを実装しましょうというセミナー- 2008年度から実施,今回5度目- 3時間/日 × 5日間連続 = 計15時間- 内容は...‣ Linuxセットアップ,Linux概要,Linuxシステム管理,Webサーバ構築,MySQLサーバセットアップ,PHP概要,Web-DB連携など
212年10月1日月曜日
K-Ruby, 15th. September 27, 2012
サーバ構築プラットフォームをどうするか(悩みどころ)
• 前年度までは,受講者ノートパソコン持参- HDDをフォーマットし,Linuxをインストール(2008~2009年度)- 仮想環境(VirtualBox)をセットアップし,その上の仮想マシンにLinuxをインストール(2010~2011年度)
3
ノートパソコンのスペックの差が,セミナーの進行を左右してしまう (ToT)
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 4
今年度(2012年度)は...
• 「受講生持込みPC」→いりません(端末室利用)• Linuxサーバは,クラウド上で構築- Amazon Web Service,Amazon EC2を利用- 最もスペックの低いmicroインスタンスを利用• 受講者全員のLinuxサーバ構築環境が同一
4
http://aws.amazon.com/jp
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 5
情報システムの構築・運用は,クラウドコンピューティングの市場拡大に伴い, ユーザ自身がサーバを所有し,システムを構築していくという形態から,パブリックに提供されるサーバシステムやサービスを利用する形態に変わっていっています. このセミナーでは,Amazon Web Service上のLinuxによるWebサイト環境の構築(Linuxのシステム管理,Web DB連携)等,パブリッククラウドの各種サービスを利用した,新しいスタイルのシステム構築について,実操作を通して学習します.
配布したパンフレット
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
5日間の内容
• 1日目- クラウドサービス(AWS)について,Linux概要• 2日目- Linuxシステム管理,セキュリティ対策• 3日目- Web-DB開発環境構築• 4日目- PHPとMySQLによる動的Webページの作成• 5日目- Git入門,phpfogの利用,SaaSについて
612年10月1日月曜日
K-Ruby, 15th. September 27, 2012 7
クラウドサービスについて確認
• クラウドの「構成要素」- SaaS (Software as a Service)- PaaS (Platform as a Service)- IaaS (Infrastructure as a Service)
ネットワークCPU/メモリ/HDD
OSミドルウェア
アプリケーション
SaaSPaaS
IaaS
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
使用テキスト(資料)について
• NPO法人LPI-Japanが公開しているテキスト(標準教科書)を利用(使用許諾確認済み)- Linux標準教科書- Linuxサーバー構築標準教科書‣ http://www.lpi.or.jp/linuxtext/server.shtml
812年10月1日月曜日
K-Ruby, 15th. September 27, 2012
使用テキスト(資料)について
• PukiWikiサイトを利用し,適時情報更新
912年10月1日月曜日
K-Ruby, 15th. September 27, 2012
Linuxサーバ構築関連内容
• SSHログイン- 公開鍵暗号方式について• viエディタの使い方- すべてコンソールからの操作に対応• Webサーバ構築- htaccessによるアクセス制御,ベーシック認証• ファイアウォール設定- iptablesによるポート制御
1012年10月1日月曜日
K-Ruby, 15th. September 27, 2012
PaaSについて
• PaaSの例として「phpfog」を利用- PHP,MySQLの実行環境を無償で提供- メールアドレスでのサインアップで即利用可能
1112年10月1日月曜日
K-Ruby, 15th. September 27, 2012
PaaSについて• Gitについて- デプロイツールとして必須(herokuも同様)- リポジトリの管理についての最低限の知識- git add / commit / push / clone / pullなどは最低限知っておく必要がある
1212年10月1日月曜日
K-Ruby, 15th. September 27, 2012
PaaSについて
• ここで問題事が...- 最初のアプリのひな形作成で,10~20分以上かかってしまう問題が発生- シェアサーバを利用しているので,全員が一度に処理しようとすると負荷がかかるのは当然かも.
13
タダだから仕方がない... (ToT)
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
SaaSについて
• Microsoft Office 365 を例に説明- 当大学でも今後使用する可能性があるかも- オフィスソフトが使える- メッセージアプリ「Lync」について実践
1412年10月1日月曜日
K-Ruby, 15th. September 27, 2012
セミナー風景• 実習室環境- 端末室のPC(Windows XP),7名受講(定員10名)
1512年10月1日月曜日
K-Ruby, 15th. September 27, 2012
アンケート結果• 最終日にアンケートをとりました- 紙ではなくWebで!- Google DocsのFormを利用(ここでもSaaS)
16
アンケート項目数は14個
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
アンケート結果(質問2,3)
17
17%
50%
33%
長い やや長いちょうど良い やや短い短い
100%
長い やや長いちょうど良い やや短い短い
質問2. 講習期間(5日間という期間)について
質問3. 講習時間(3時間/日という時間)について
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
アンケート結果(質問6,7)
18
33%
50%
17%
ほとんど知らない2割程度は知っていた半分は知っていたほとんど知っていた
50% 50%
高い やや高いちょうど良い やや低い低い
質問6. 事前知識について 質問7. セミナーの内容レベルについて
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
アンケート結果(質問9,13)
19
17%
33%50%
満足 やや満足 普通やや不満 不満
17%
83%
満足 やや満足 普通やや不満 不満
質問9. 講習環境について 質問13. セミナー全体について
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
アンケート結果(質問12)
• 今後,どのような講座を希望しますか?- 新しいWeb技術やサーバ管理の知識についてのものであれば何でも受けてみたいです.- 今回のセミナーでやったPHPをもう少しやってみたいです.- 情報処理技術者応用以上の午後試験に対応した講座.- PHPの概要とMySQLデータベースとの連携の講座が途中混乱してしまったので,もう少し詳細にあればいいと思いました.- もう少し優しくし,多くの人がきて勉強してほしいと思います.
2012年10月1日月曜日
K-Ruby, 15th. September 27, 2012
アンケート結果(質問14)
• セミナーについてのご意見・ご感想をご自由にご記入ください- 講師の先生達の努力を感謝します.- とても有意義な1週間でした.ありがとうございました.ウインドウを複数開いて作業したので,ディスプレイを2つ以上,もしくはもう少し(かなり)大きめのディスプレイがあると良いと思いました.- 興味深く聞きました.ありがとうございました.これから安全にクラウドを利用する方法を逐次セミナーを開いてほしい.
2112年10月1日月曜日
K-Ruby, 15th. September 27, 2012
アンケート結果(質問14)
- わかりやすく教えていただけてよかったです.セミナー後にまた復習して身につけたいと思います.ありがとうございました.- 各先生方,お疲れ様でした.のんびりメモをとる時間がなく,進行が若干速かったような感じですが非常に貴重な実習体験ができました.時間を見つけては復習して身につけていきたいと思います.- とても勉強になりました.このセミナーでプログラムに触れたことでもう少し積極的にプログラムを触ってみようと思いました.コンピュータへの興味も増えたので,またセミナーが開催された時には参加します.5日間ありがとうございました.
2212年10月1日月曜日
K-Ruby, 15th. September 27, 2012
セミナーも無事に終わり...• インスタンスの使用状況を確認- AMS Management Console により,インスタンス利用の統計データが取得できる‣ クラウド利用の利点
2312年10月1日月曜日
K-Ruby, 15th. September 27, 2012
CPU Utilization (%)
24
最大値
平均値
4日目:Web-DB連携,PHPプログラミング
1日目 2日目 3日目 4日目 5日目
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 25
Network In (Bytes)
最大値
平均値
2日目: yum update1日目: 不明特定のユーザのよう
1日目 2日目 3日目 4日目 5日目
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 26
Network Out (Bytes)
最大値
平均値
後半高い: クライアントからのWebアクセス
1日目 2日目 3日目 4日目 5日目
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
EC2インスタンス利用のまとめ
• 一番低いスペック(最大2ECU,RAM: 約600MB)microインスタンスで,常時約10台稼動.
• 一斉に「yum update」を行っても問題なし.• 5日間,コマンドの応答不能,コンソールの異常終了などのトラブルは一切なかった.
27
Amazonすごい! 受講生20名(20台)くらいでも問題ないのでは!(゚∀゚)
しかし... 問題がただ1つ...AWSはタダ(無償)ではないということ...
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
EC2インスタンスの利用環境構築について
• Amazon Web Serviceは,基本,有償である.- クレジットカード決済- カード番号を登録しなければサインアップ不可• 施設として某支払い代行業者と契約し,講習会用の経費で,本セミナー用アカウントを準備する予定だった.
• しかし,間に合わず,私個人のアカウントを利用• さて,支払いどうする...
2812年10月1日月曜日
K-Ruby, 15th. September 27, 2012
まずはEC2インスタンスタイプの選択
• 料金の一番安い(約0.03ドル/時)のmicroタイプに一決
29
タイプ CPU メモリ ストレージ Linux 料金(1時間)
small 1ECU 1.7GB 160GB $0.092
medium 2ECU 3.75GB 410GB $0.184
large 2ECU 7.5GB 850GB $0.368
extra large 4ECU 15GB 1,690GB $0.736
micro Max. 2ECU 613MB 8GB, EBS $0.027
※1 microタイプ以外のストレージは,すべてインスタンスストレージ※2 「ECU(EC2 Compute Unit)」は,Amazon独自のCPU計算性能単位「1ECU≠1CPU」 1ECUは,1つの1.0~1.2GHz 2007 Opteron または 2007 Xeon プロセッサ相当,らしい.
Amazon EC2 Pricing | アマゾン ウェブ サービス(AWS 日本語)http://aws.amazon.com/jp/ec2/pricing/Amazon EC2 インスタンスタイプ | アマゾン ウェブ サービス(AWS 日本語)http://aws.amazon.com/jp/ec2/instance-types/
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
利用費負担をどうするか
• 幸い「無料使用範囲」適用中なう
30
AWSに新規登録した人対象に,1年間の無料利用枠を提供
Amazon EC2 microインスタンスを1年間無料で利用できる!
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
無料利用枠内容
• EC2- microインスタンス(Linux,Windows Server)共に750時間分- EBS 30GBまで,100万I/O,スナップショット用2GBまで
• S3- ストレージ5GBまで- 20,000get/2,000putリクエスト• データ転送- 全サービス,帯域幅「送信(アウト)」15GB
31http://aws.amazon.com/jp/free/
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
料金計算
• セミナー5日間×24時間×10名分=1,200時間→450時間 overで,$12.15(約970円)ナリ~
• 担当者の準備期間(事前5日間)を入れると,プラス5日間×24時間×3名分=360時間($9.72,約770円)で$21.87(約1,740円)ナリ~
• セミナーに本当に必要な利用時間:610時間→OK!- セミナー5日間×5時間×10名分=250時間- 準備期間5日間×24時間×3名分=360時間• 公開用サーバではないので,常時稼動必要なし• インスタンスを無駄に稼動させない工夫が必要
3212年10月1日月曜日
K-Ruby, 15th. September 27, 2012
EC2 Management Console
• 通常,インスタンスの管理はコレなんですが...
3312年10月1日月曜日
K-Ruby, 15th. September 27, 2012
さてここで問題
• インスタンスのStart/Stopは,基本「Amazon Management Console」で操作(ログイン必須)
• しかし,私個人のアカウントパスワードを教えるのはちょっと...
• インスタンスのStart/Stopを綿密にスケジューリングするか...
• 利用者(受講生,担当職員)が自由にインスタンスを制御できる機構があれば...
3412年10月1日月曜日
K-Ruby, 15th. September 27, 2012
さらに問題
• 外から引けるホスト名(Public DNS Name)や,IPアドレス(Public IP Address)が,インスタンス再起動の度に変化してしまう.
• その都度,利用者に最新の情報(ホスト名,IPアドレス)をお知らせしなければならない.
35
コレよ~(・∀・)
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
結局,インスタンス管理どうする?
• 利用者によるインスタンス制御,状態監視は必須• 利用者は...- 現在のインスタンスの状態を知る必要がある.(Running or Stopped)- 現在のインスタンスのホスト名,IPアドレスを知る必要がある.- 無駄な課金を抑止するために,インスタンスを適時Start/Stopする必要がある.
36
独自のインスタンス管理ツールを作るしかない...
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Ruby
• 「AWS SDK」とは?- Amazonの各種サービスAPIを利用するための開発キット
• それの,Ruby版公式SDK!(2011年07月公開)
37
参考資料AWS SDK for Ruby | アマゾン ウェブ サービス(AWS日本語)http://aws.amazon.com/jp/sdkforruby/
「gem install aws-sdk」でおk(・∀・)b
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Rubyを使ってみる
• とりあえず試しに使ってみる- Bundlerでaws-sdkを入れてみる- 適当なディレクトリを作って,Gemfileを作成
38
$ mkdir awstest$ cd awstest/
$ bundle initWriting new Gemfile to /Users/hoge/work/awstest/Gemfile
source "https://rubygems.org"
gem "aws-sdk"
Gemfile
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Rubyを使ってみる
• PATHを指定して,「bundle install」• irbでrequireできるか確認
39
$ bundle install --path vendor/bundleFetching gem metadata from https://rubygems.org/........ :Post-install message from httparty:When you HTTParty, you must party hard!
$ bundle exec irb
irb(main)> require 'aws'=> true
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Rubyを使ってみる
• AWSへアクセスするために必要な「アクセスキー」と「シークレットアクセスキー」等を設定するコンフィグファイルを作成する.
40
irb(main)> conf_path = File.join(Dir::getwd, "config.yml")=> "/Users/hoge/work/awstest/config.yml"
irb(main)> AWS.config(YAML.load_file(conf_path))=> <AWS::Core::Configuration>
access_key_id: REPLACE_WITH_ACCESS_KEY_IDsecret_access_key: REPLACE_WITH_SECRET_ACCESS_KEYsimple_db_endpoint: ec2.ap-northeast-1.amazonaws.com
config.yml
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Rubyを使ってみる
• EC2のインスタンス生成はコレだけ.
41
irb(main)> ec2 = AWS::EC2.new=> <AWS::EC2>
irb(main)> ec2.instances.count=> 2
irb(main)> ins = ec2.instances["i-402ed043"]=> <AWS::EC2::Instance id:i-402ed043>
irb(main)> ins.exists?=> true
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Rubyを使ってみる
• EC2インスタンスのStart/Stopメソッド
42
irb(main)> ins.status=> :stopped
irb(main)> ins.start=> nil
irb(main)> ins.status=> :pending
irb(main)> ins.status=> :running
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Rubyを使ってみる
• EC2インスタンスのホスト名/IPアドレスの取得メソッド
43
irb(main)> ins.private_dns_name=> "ip-10-123-34-56.ap-northeast-1.compute.internal"
irb(main)> ins.public_dns_name=> "ec2-175-XXX-YYY-ZZZ.ap-northeast-1.compute.amazonaws.com"
irb(main)> ins.instance_type=> "t1.micro"
irb(main)> ins.private_ip_address=> "10.123.34.56"
irb(main)> ins.public_ip_address=> "175.XXX.YYY.ZZZ"
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
AWS SDK for Rubyを使ってみる
• EC2のコンソール出力
44
irb(main)> puts ins.console_outputXen Minimal OS! start_info: 0xac4000(VA) nr_pages: 0x26700 : :Starting crond: [ OK ]Starting atd: [ OK ]Starting yum-updatesd: [ OK ]Running cloud-init user-scripts (none found)[ OK ]
Amazon Linux AMI release 2012.03Kernel 3.2.21-1.32.6.amzn1.x86_64 on an x86_64
ip-10-123-34-56 login:=> nil
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
Railsでaws-sdkを利用する
• 次に,Railsで「aws-sdk」を利用してみる- これもGemfileにaws-sdkを指定するだけ- 以下,Bundlerを使った基本的なRailsアプリ作成
45
$ mkdir ccaws$ cd ccaws/
$ bundle initWriting new Gemfile to /Users/hoge/work/ccaws/Gemfile
source "https://rubygems.org"gem "rails"gem "aws-sdk"
Gemfile
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
Railsでaws-sdkを利用する
• Bundlerを使った基本的なRailsアプリ作成手順• コントローラは一つ「Main」のみとしますー
46
$ bundle install --path vendor/bundle
$ bundle exec rails new .
$ bundle install
$ bundle exec rails g controller Main index
Rails.root
config
initializers
app
controllers
views
main
routes.rb
aws.rb
main_controller.rb
index.html.erb
ec2.yml
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 47
instance_id: - "i-40xec201" - "i-46x20303" - "i-44x20305" - "i-4ax20307" - "i-48x20309" - "i-4ex2030b" - "i-4cx2030d" - "i-52x2030f" - "i-50x20311" - "i-56x20315"
ec2.yml
10個のインスタンスIDを記載したYAMLファイルインスタンスを追加したり削除する場合はこのファイルを変更する
AWS.config ({ :access_key_id => 'REPLACE_WITH_ACCESS_KEY_ID', :secret_access_key => 'REPLACE_WITH_SECRET_ACCESS_KEY', :ec2_endpoint => 'ec2.ap-northeast-1.amazonaws.com',})
aws.rb
AWS設定.AWSクラスを呼び出す前に必ず実行しておく必要ありアクセスキー,シークレットキー,それとリージョンを指定する
※ここに記載しているのは架空のIDです
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 48
class MainController < ApplicationController INSTANCES_YAML_PATH = File.join(Rails.root, "config", "ec2.yml") def index instances = [] @infos = Hash.new{ |h, k| h[k] = {}}
all = YAML.load_file(INSTANCES_YAML_PATH) @instance_ids = all["instance_id"]
ec2 = AWS::EC2.new
@instance_ids.each do |instance_id| instances << ec2.instances[instance_id] end instances.each do |ins| @infos[ins.id]["tag"] = ins.tags["ccsemi"] @infos[ins.id]["status"] = ins.status @infos[ins.id]["public_dns_name"] = ins.public_dns_name @infos[ins.id]["public_ip_address"] = ins.public_ip_address end end
main_controller.rb
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 49
def stop_instance id = params[:id] ec2 = AWS::EC2.new
instance = ec2.instances[id] if instance.status.to_s == "running" instance.stop end redirect_to main_path end def start_instance id = params[:id] ec2 = AWS::EC2.new instance = ec2.instances[id]
if instance.status.to_s == "stopped" instance.start end redirect_to main_path endend
main_controller.rb(続き)
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 50
<table border="1"><tr> <th>Instance ID</th> <th>Tag name</th> <th>Status</th> <th>Action</th> <th>Public DNS name</th> <th>Public IP address</th></tr><% @instance_ids.each do |id| %> <tr> <td><%= id %></td> <td><%= @infos[id]["tag"] %></td> <td><%= @infos[id]["status"] %></td> <td> <%= if @infos[id]["status"].to_s == "running" then button_to "Stop", stop_instance_path(:id => id) elsif @infos[id]["status"].to_s == "stopped" then button_to "Start", start_instance_path(:id => id) end %> </td> <td><%= @infos[id]["public_dns_name"] %></td> <td><%= @infos[id]["public_ip_address"] %></td> </tr><% end %></table>
index.html.erb
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 51
Ccaws::Application.routes.draw do root :to => 'main#index' match 'main' => 'main#index' match 'stop_instance/:id' => 'main#stop_instance', :as => 'stop_instance' match 'start_instance/:id' => 'main#start_instance', :as => 'start_instance'end
routes.rb
$ bundle exec rails s
ルーティング設定.URLパターンは3つ
Railsサーバの起動
Rails.root
config
initializers
app
controllers
views
main
routes.rb
aws.rb
main_controller.rb
index.html.erb
ec2.yml
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012 52
公開サーバにデプロイ ・Apache + Passenger 構成 ・ベーシック認証[ Start ]: インスタンス起動
[ Stop ]: インスタンス停止
インスタンスの状態 ホスト(FQDN)とIPアドレスを表示(インスタンス稼動時のみ)
実行結果画面
12年10月1日月曜日
K-Ruby, 15th. September 27, 2012
おわりに
• クラウドサービスを利用したセミナーということで,色々と不安要素があったが無事に終わった.- クラウドサービスがダウンしたら,セミナーはできない.→Amazon EC2 SLA(99.95%)
• メリットはたくさん!- 受講者が同一の環境でセミナー構築実習できる- クライアントの環境はSSHクライアントのみ- スナップショットによるバックアップ/リストア- グローバルIPアドレスが利用できる
5312年10月1日月曜日
K-Ruby, 15th. September 27, 2012
おわりに
• 来年度は,インフラ関係とプログラム開発と分けても良いかも...- 「クラウド利用とLinux構築(3日間)」- 「Web-DB連携プログラミング(3日間)」もちろんRuby on Railsでも
• 本学の教職員だけでなく,一般向けにも実施しても良いかも...
• 参加募集してみて,人が集まるかな...?
5412年10月1日月曜日