AWS EC2を使って無料枠でWebサーバを立ててみた(2015年12月版)

f:id:watass:20141103203916j:plain

# 2015年12月アップデートしました。本記事の元ネタは2014年11月に書かれたものです。

やはり時代は話題のAWS、ということで。クラウド新時代のIaaSとして、どんどん成長を続けるAWS。クレジットカード登録必須なのが抵抗感を煽っていましたが、やらざるを得ない状況になりつつあるので、とうとう登録しちゃいました。
正直、この手の新しいプラットフォームは流行が廃れたらもう使わなくなる技術だと思っていたわけですが、想像以上に利便性が高く、関連知識がないとWebサービスの構築もできない時代が来る気がしたので、先行投資ということで断腸の思いでサービス登録しました。

ありきたりではありますが、メモ書きとして、Webサーバ構築までの流れをメモ。


Amazon Web Services (AWS)とは?

AWS、正式名称はAmazon Web Services

ここで語らずとも、そこら中で紹介されているので、詳細は割愛しますが、クラウド上でサーバを簡単に作ったり、破棄したりできて、スペックが足りなくなったら、サーバを追加、メモリ増築、なんでもござれの夢のようなサービス。ハードウェア仮想化の技術なので、ハードに関する知識がなくとも、直感的な操作で高速にサーバ構築ができてしまうわけですね。Amazonというと、ECサイトのイメージが大きいわけですが、実はクラウドサービスではデファクトスタンダード的なボジションを獲得しつつあります。すごいぞAmazon

AWSでは、独自のEC2やRDS、S3などのサービスを内部で持っていて、基本的には利用料に応じた従量課金制度となっています。そのため、クレジットカードを登録しておくと、知らぬ間に課金されて死ぬなんてことが考えられます。そんな理由から、貧乏エンジニアの私なんかは敬遠していたわけですが、一年間無料でいろいろ使えるよ!という甘い言葉にふらふらついていってしまったわけです。ググると、無料枠でやれる範囲も結構書いてあるっぽいので、大丈夫だろうと。課金されたとしても、勉強代として・・・諦めましょう。

※本記事はAWS無料枠での作業を保証するものではありません。また、Amazonの無料枠変更によって、本記事の範囲内が無料枠でなくなる恐れもあります。参考程度でお願いします。


Amazon Web Servicesにサインアップ

まずはAWSの公式ウェブサイトにアクセス。
http://aws.amazon.com/jp/

f:id:watass:20151226224428p:plain

右上のサインアップをクリックして、新規ユーザとして登録します。サイト中に親切な案内がいっぱいあるので、問題なく進められると思います。

サイトの案内にあわせて、クレジットカード情報を登録して、電話番号での認証などをやります。プランなどの設定もありますが、ベーシックでOKです。というか、他のプランだと有料なのでこれにしましょう。各種認証を終えたら、AWSのマネージメントコンソールにログインします。

f:id:watass:20151226230300p:plain

こんな画面にアクセスできたらログイン完了です。ここで右上のリージョン設定から、アジアパシフィック(東京)を選んでおきましょう。

f:id:watass:20151226230353p:plain

以上でAWSの基本設定は完了です。次に、WebサーバとしてEC2インスタンスを作成します。


EC2インスタンスを作成

EC2とは、Elastic Compute Cloudの略で、AWSの仮想サーバです。これを一つ作成すると、一つのサーバとして振る舞いますので、簡単にサーバの追加、削除ができます。また、メモリやストレージの拡張も簡単にコンソールからできます。ずばり、AWSの基本はEC2なので、これをしっかりできるようになりましょう。なんと今なら、月750時間まで無料でEC2が使えます。ただし、台数が増えると、その分だけ時間も減りますので注意。フル稼働だと1台が限界ですね。また、インスタンスは1時間単位での課金ですが、1時間未満の起動の場合(すぐに立ち上げて削除するとか)にも1時間として課金されるので、インスタンスの起動と削除や停止などを繰り返しまくっていると実際の時間に関係なく、無料枠を超える場合があります。注意してくださいね。

とはいえ、まずはやってみないと注意しようもないので、実際に手を動かしてみます。AWSのコンソールから、EC2をクリック。すると、EC2ダッシュボードにアクセスできます。

f:id:watass:20151226230459p:plain

ここで左側メニューの「インスタンス」から「インスタンスの作成」ボタンをクリックしてインスタンスを立ち上げます。インスタンスとは、EC2で起動されるリソースの単位です。サーバの1台、2台と同じようなものだと思ってください。

f:id:watass:20151226230653p:plain

インスタンスを立ち上げると、AMIの選択画面に移ります。AMIとは、Amazon Machine Imageの略で、OSのディスクイメージみたいなものですね。CentOSWindows Serverもあるのですが、とりあえず定番のAmazon Linux AMIを選択しておきましょう。これはAmazonCentOSをベースにしてカスタムしたもので、AWS特有の便利なツールも内蔵されています。CentOSベースなので操作感もそんな違和感ないです。ちなみに、「無料利用枠の対象」と書かれているAMIは無料で使えるので、Amazon Linux AMIは無料で使えるわけです。ありがとうAmazon

次にインスタンスのタイプを選びます。CPUとかメモリとかで様々な種類のインスタンスタイプが存在するわけですが、後から変更できるし、無料枠はt2.microのみになりますので、これをそのまま選択します。

さらにインスタンスの詳細設定を行います。各項目は以下にまとめてみました。

インスタンス

作成するインスタンス数。1でOK。

購入のオプション

スポットインスタンスという特殊なインスタンスの購入方式を採用するかどうか。とりあえず無視でOK。
参考:Amazon EC2編~スポットインスタンスを使ってみよう!~ | ナレコムAWSレシピ

ネットワーク

どのVPC上にインスタンスを作成するかの設定。VPCは広大なAWSの環境に中で作成できる自分だけのネットワーク空間的なもの。プライベートなネットワークなども構築できるので、作成しておくことをおすすめしますが、今回はインスタンスを立てるのが目的なのでデフォルトにしましょう。VPCの作成や使用に追加コストはかかりません。

サブネット

VPC上のサブネットマスクの設定。VPC側の設定を行わないならば適当でいいです。

自動割り当てパブリックIP

パブリックIPを自動で割り当てるかの設定。デフォルトの有効設定でよいです。

IAMロール

作成するインスタンスに割り当てる権限の設定です。最初は気にせずに「なし」でよいですが、後ほど自分でIAMロールを作成して割り当てるようにすると、作成したインスタンスからAWSの他のリソースへアクセスできるようになったりします。IAMロールの変更はできますが、「なし」を設定した場合には後からIAMロールの追加ができないので、試す際には別のインスタンスを立てるようにしてください。

シャットダウン操作

インスタンス内でのシャットダウンの意図する動作の設定。シャットダウンすることでインスタンスそのものを破棄するようにも設定できますが、基本的には停止でいいと思います。

削除保護の有効化

操作ミスで誤ってインスタンスを削除することを防止します。削除する際の操作がちょっとだけ複雑になります。そんなに重要なインスタンスを立てるわけでもないならばチェックしなくてもいいんじゃないかと思います。

CloundWatch詳細モニタリングを有効化

CloudWatchというAWS上のサービスを監視するサービスがAWSから提供されていますが、それを使ってインスタンスを詳細に監視します。追加料金かかりますので、チェックしないようにします。

テナンシー

インスタンスを起動するマシンの実体をどこに持つかという設定です。基本的にはアカウント関係なく、AWS上のすべてのインスタンスは何台かのAmazonが所有する実マシン上で起動しますが、セキュリティなどの問題から他ユーザのインスタンスと同じマシン上に立てたくないケースがあります。そういった場合にはテナンシーを「専有」にできますが、追加費用がかかるので「共有」にしましょう。


とりあえず上記をざっと設定したら「ストレージの追加」でEBSの設定をします。

f:id:watass:20151226232440p:plain

EBSとは、Elastic Block Storeの略で、仮想ストレージです。無料枠ならば、合計30GB以内のEBS汎用SSDかマグネティックの組み合わせが可能です。今回は8GB、Volume TypeはEBS汎用SSDにしてみました。

ストレージの追加が完了したら、次はインスタンスにタグ付けします。インスタンスに対してキーと値が設定できますが、これはインスタンスに目印をつけることが目的なので、特に何もしなくてもOKです。

最後にセキュリティグループの設定をします。セキュリティグループとはインスタンスに対して適用するファイアウォール設定みたいなものです。「新しいセキュリティグループを作成」ボタンをクリックします。

f:id:watass:20151226232821p:plain

デフォルトだとSSHのみがOKになっています。Webサーバとして動かすには、HTTPを許可する必要がありますが、とりあえず今はこのままいきます。送信元ではアクセス元となるIPアドレスが指定できるわけですが、My IPで現在使用しているIPからのアクセスのみを許可する設定にしておくようにしましょう。ただ、固定IPを契約していない場合、IPは定期的に変更されることがあるので、その度にセキュリティグループを設定し直す必要が出てきてしまうわけですが、まぁその辺の自動化は後でやるとしましょう。

以上で基本設定は完了です。最後の設定確認で問題なければ、作成をクリックしてインスタンスを立ち上げましょう。

f:id:watass:20151226233044p:plain

作成をクリックすると、上記のようなモーダルウインドウが開き、秘密鍵の設定を求められますので、新規に作成します。作成した秘密鍵はダウンロードされますので、大事に保管しておいてください。

問題なくインスタンス作成が完了したら、EC2ダッシュボードからインスタンスをクリック。

f:id:watass:20151226233137p:plain

こんな感じでインスタンスがrunningになっていることがわかると思います。この画面から、インスタンスの起動や破棄、新規作成やパブリックIPの確認などができます。ちなみに、ステータスチェックがOKに、インスタンスの状態がrunningになるまでは操作できないので、それまではちょっと待ちましょう。

次は作成したインスタンスSSHでアクセスしてみます。


EC2インスタンスSSHでアクセスする

EC2のインスタンス一覧で、アクセスしたいインスタンスを選択し、接続をクリック。

f:id:watass:20151226233251p:plain

すると、上記のようなモーダルウインドウが開いて、接続するためのコマンドを丁寧に教えてくれます。まず、ダウンロードした秘密鍵をchmodで権限設定して、sshで接続。今回使用しているクライアントPCはmacなので、デフォルトのコンソールでssh接続できます。Windowsならば、PuTTYとかPoderosaとかで接続しましょう。なお、接続するディレクトリに秘密鍵を移動しておくようにしましょう。そのディレクトリ下でSSH接続するようにします。実際のコマンド例はこんな感じですね。

mkdir aws
mv ~/Downloads/service1.pem aws
cd aws
ssh -i service1.pem ec2-user@255.255.255.255

簡単ですね。こいつが表示されたらログイン完了です。

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|


Amazon Linux AMIにApache httpdをインストール

ssh接続できたら、後はいつものようにhttpdのインストールです。基本的にはCentOSなので、違和感なく設定できます。最初のログインではアップデートをやっておきましょう。

$ sudo yum update

完了したら、httpdのインストールと起動をやります。

$ sudo yum install httpd
$ sudo service httpd start

OKが表示されたら起動完了。ドキュメントルートに以下のようなindex.htmlを作成します。

<html>
<head>
<title>AWS EC2 TEST</title>
</head>
<body>
<h1>Hello,AWS EC2!</h1>
My name is wata.
</body>
</html>
$ sudo vi /var/www/html/index.html

これでインスタンス側の準備は完了です。次はブラウザから早速アクセスしてみましょう。


ブラウザからEC2インスタンスにアクセスする

インスタンス側の準備ができたので、EC2のインスタンス一覧からパブリックIPを見て、そこへアクセスすればOKなんじゃ・・・と思いきや、そうです。セキュリティグループの設定をしていないのでアクセスできないんですね。設定変更はEC2ダッシュボードからネットワーク&セキュリティのセキュリティグループをクリック。

f:id:watass:20151226233543p:plain

すると、こんな画面になりますので、今回立ち上げたインスタンスで使っているセキュリティグループを選択して、インバウンドタブの編集をクリックします。

f:id:watass:20151226233628p:plain

編集画面がモーダルウインドウで表示されますので、ルールの追加をクリック。タイプはHTTPを選択しましょう。送信元は任意の場所でOKです。これで保存しましょう。

以上でセキュリティグループの設定は完了です。これで作成したインスタンスのパブリックIPをブラウザに入力すると・・・

f:id:watass:20141103225603p:plain

表示されました!やったね。


EC2インスタンスを停止する

とりあえずインスタンスは立ち上げたらそれでOKなんですが、まだまともに運用する状態でもないので、精神的安穏のためにインスタンスは停止しておきましょう。EC2のインスタンス一覧にアクセスして、停止したいインスタンスの上で右クリックします。

f:id:watass:20151226233754p:plain

すると、メニューが表示されますので、インスタンスの状態から停止を選択します。すると、モーダルウインドウでデータが消えますみたいな怖い文章が出ますが、これはエフェメラルディスクというディスク上のデータが消える、という警告なので、意識せずに使っている分には問題なしです。停止させちゃいましょう。

これでインスタンスの状態が停止になれば停止完了です。停止中はインスタンスの起動時間にカウントされませんので、不安なうちは定期的に止めるとよさそうですね。ただ、パブリックIPを使っている分には、停止のたびにIPが変更されるので、注意しましょう。


課金額を確認する

やはり課金額のチェックはできたほうがいいですよね。見方は簡単で、AWSコンソールで右上の名前のドロップダウンリストから、請求とコスト管理をクリックするだけ。

f:id:watass:20151226233958p:plain

僕は無料枠が終わってしまっているのでこんな感じですが、おそらくみなさんは0ドルになっているはずです。ここの数字が増えたら死ぬほど焦って設定を見直しましょう。


無料枠を超えたらアラートメールを送るよう設定する

アラートメールの設定は書いておこうかと思ったんですが、既にすっきりわかりやすくまとめてくれている人がいることと、もう既に記事を書く体力がないので、これに関しては記事紹介のみにしておきます。


6時間周期のチェックらしいので、気がついたらとんでもない額に・・なんて可能性も多少はありますが、まぁ大丈夫でしょう。ちなみに、携帯にメールを飛ばすようにすると、エラーメールを受け取るインフラエンジニアの気分を味わえるのでおすすめです(何


まとめ

  • AWS EC2で簡単にWebサーバが構築できておすすめ
  • ファイアウォール設定とか、秘密鍵設定とかがGUIベースで簡単にできる
  • 必要なときに必要なだけ立ち上げて、アラートメールと設定すれば課金額も怖くない・・・はず

ここからがAWSの真骨頂だ・・・

今回はざっと設定しただけですので、AWSの利点があんま生かせていない感がありますが、それでも面倒なファイアウォール設定、接続元IPアドレスの限定、秘密鍵の設定などがGUIベースでさくっとできることに感動する人は少なくないはずです。
EC2は処理能力が足りなくなったら、簡単にスケールアウト、スケールアップができる利点もありますし、ロードバランサやNoSQLデータベースなど、いろいろ便利なサービスが充実しているので、使えば使うほどその優秀さを感じることができそうです。
何より、サーバの作成、破棄が簡単にできるので、例えば、AnsibleとかChefでインフラをコード化し、必要に応じてすぐに環境をコピーできたり、Gitなどを活用してデプロイを簡単にできたりするので、テスト環境や開発環境を気軽に作れちゃうんですね。これがすごい。
こりゃ無料枠終わるときには苦労しそうだなぁ・・・


参考にした記事

Amazon Web Services入門 (全17回) - プログラミングならドットインストール
# ドットインストール様のAWS解説動画。ちょっと古いですが、わかりやすいです。
Amazon EC2再入門 2014年7月版 | Developers.IO
# Developers.IO様のEC2設定記事の当時最新版。インスタンスの詳細設定で非常に参考になりました。
EC2でインスタンス(仮想サーバー)を作る方法【日本語解説】 – AWSの使い方 ≫ 使い方・方法まとめサイト - usedoor
# Userdoor様のEC2設定記事。無料枠の確認で重宝させていただきました。
Security GroupではSSHを0.0.0.0/0に開放するべからず | mooapp
# mooapp様の記事。Secutity Groupの設定でSSHはAnywhereを設定しない推奨みたいな。
EBSからブートしたEC2インスタンスにエフェメラルディスクを起動時に自動マウントする方法 - hiroohiのメモ
# hiroohiのメモ様の記事。エフェメラルディスクってなんやねんというときに辿り着いた記事。