akiyoko blog

akiyoko の IT技術系ブログです

Mezzanine の本番設定(その1:AWS 環境構築)〜AWS 環境構築から運用設定まで〜

こんにちは、akiyoko です。

Mezzanine は Python製の WordPress風フルスタックCMSフレームワークですが、個人的にブログサイト(将来的には ECサイトを増設予定)を本番運用するために、昨年12月頃から調査をしてきました。

akiyoko.hatenablog.jp


それ以来いろいろと企画やら調整を地道に進めてきましたが、この 7月にようやく本番運用に漕ぎ着けることができました。

それを記念して(?)AWS の初期設定から Mezzanine の本番デプロイ、ちょっとした運用設定までの記録を一旦ここでまとめておきたいと思います。

かなり長くなるので、

の 4本に記事を分けました。

今回はその 1本目、「その1:AWS 環境構築」について説明します。


AWS 環境構築として実施した内容としては、

  • IAM 設定(ルートアカウント・admin ユーザの設定)
  • VPC 設定(1ネットワーク+ 1サブネット)
  • EC2 設定(Ubuntu 14.04 LTS インスタンスの起動)
  • Amazon SES 設定(ドメイン認証、送信制限の解除申請)

となります。



 

1. IAM の初期設定

基本方針として、AWS ルートアカウントは原則使用せず、AdministratorAccess 権限を持たせた管理者ユーザー「admin」を新たに作成して利用することとします。

なお、ルートアカウントは、MFA(二段階認証)でセキュリティを強化しておきます。


(参考)


 

1. 1. ルートアカウントに MFA 導入

1.1.1. スマホに仮想MFAアプリケーションをインストール

まず、Android に

というアプリをインストールします。


なお、仮想MFA アプリケーションの一覧はこちらです。
私は Android ユーザなので Android を使っていますが、その他のスマホを使っている場合は適宜別のアプリを検討してください。

f:id:akiyoko:20160829014611p:plain

Android Google AuthenticatorAuthy 2 段階認証
iPhone Google Authenticator
Windows Phone Authenticator
Blackberry Google Authenticator

IAM - Multi-factor Authentication より)



(参考)AWS MFAの設定 - Qiita


 

1.1.2. AWS Management Console での設定

[IAM] > [Dashboard] から、[Security Status] > [Activate MFA on your root account] > [Manage MFA] を選択します。

f:id:akiyoko:20160829014934p:plain

[A virtual MFA device](仮想 MFA デバイス)を選択。

f:id:akiyoko:20160829015326p:plain

[Don't show me this dialog again] を選択して次へ。

f:id:akiyoko:20160829015853p:plain


以下の QRコードを 1.1.1. でインストールした「Google 認証システム」アプリでスキャンして、アプリをルートアカウントと紐付けます。

f:id:akiyoko:20160829020107p:plain


これで、AWS ルートアカウントでのログイン時にアプリで払い出されるワンタイムトークンが必要になるため、不正ログインに対するセキュリティが向上します。

 

1.2. パスワードポリシーの変更

[Dashboard] から、[Security Status] > [Manage Password Policy] をクリックします。

f:id:akiyoko:20160829020329p:plain


ここで、パスワードポリシーを

  • パスワードの最小長:8
  • 英大文字、英小文字、数字の組み合わせ
  • ユーザーにパスワードの変更を許可

とします。

有効期間、再利用禁止などのポリシーは今回設定していませんが、ニーズがあり次第、適宜設定することとします。

f:id:akiyoko:20160829020557p:plain


 

1.3. IAMユーザ、IAMグループの管理

 

1.3.1. IAMユーザ作成

管理者ユーザ「admin」を作成します。

f:id:akiyoko:20160829022915p:plain
f:id:akiyoko:20160829022936p:plain

アクセスキーを CSV(credentials.csv)でダウンロードしておきます。
f:id:akiyoko:20160829023157p:plain

User Name,Access Key Id,Secret Access Key
"admin",AKIxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


次に、作成したユーザの [Security Credentials](認証情報)タブから、自動作成パスワードを払い出して設定します。

[Manage Password]をクリック。
f:id:akiyoko:20160829023522p:plain

「Assign an auto-generated password」をチェックして、[Apply]をクリック。
f:id:akiyoko:20160829023547p:plain

念のため、パスワードを CSV(admin_pass_credentials.csv)でダウンロードしておきます。
f:id:akiyoko:20160829023702p:plain

User Name,Password,Direct Signin Link
"admin",xxxxxxxxxxxx,https://53xxxxxxxxxx.signin.aws.amazon.com/console


なお、adminユーザには二段階認証は設定しません。 *1


 

1.3.2. IAMグループ作成

adminユーザのための管理者グループ「admin」を作成します。

f:id:akiyoko:20160829023957p:plain

完全な管理者アクセス権限(AdministratorAccess)ポリシーをアタッチします。

f:id:akiyoko:20160829024245p:plain
f:id:akiyoko:20160829024306p:plain

次に、admin グループに admin ユーザを追加します。

作成したグループを選択して、「Add Users to Group」をクリック。
f:id:akiyoko:20160829024412p:plain

追加したいユーザ(ここでは「admin」)を選択して、「Add Users」をクリック。
f:id:akiyoko:20160829024528p:plain
f:id:akiyoko:20160829024556p:plain


 

1.3.3. admin で再ログイン

以下、adminユーザで操作します。

一旦ログアウトし、

https://{AWS Account ID}.signin.aws.amazon.com/console

から、admin ユーザでログインします。なお、「AWS Account ID」は、AWSアカウントに紐づく 12桁の数字で、My Account ページの[Accout Settings]からも確認できます。


ログインしたら、リージョンを「Tokyo」にしておきます。
f:id:akiyoko:20160829024729p:plain


 

2. VPC の初期設定

以前に書いた 「AWS体験ハンズオン ~セキュア&スケーラブルウェブサービス構築~」に参加してきました - akiyoko blog で実現したような、

  • 別アベイラビリティゾーンに Webサーバを冗長構成して、ELB を使ってロードバランシング
  • プライベートなサブネットに RDS を配置(且つ、別アベイラビリティゾーンにレプリケーション)

は行わず、最小限の構成にしています。


今回構築する構成の最終形は、このようになります。
f:id:akiyoko:20160911110053p:plain


(参考)0から始めるAWS入門①:VPC編 - Qiita

 

2.1. VPC の作成

CIDR が「10.0.0.0/16」の VPC を作成します。

[VPC] > [Your VPCs] から、「Create VPC」ボタンをクリック。

f:id:akiyoko:20160830001821p:plain

以下を設定します。

Name tag P1
CIDR block 10.0.0.0/16
Tenancy Default

f:id:akiyoko:20160830001850p:plain


【注意】
このままの設定では、あとでインスタンスを起動して sudo を実行した際に、下記のエラーが出るので(コマンド自体は実行されているっぽい)、DNS Hostnames の設定を「Yes」に変更します。(すでに EC2インスタンスを起動していた場合には、再起動が必要です。)

$ sudo ls
sudo: unable to resolve host ip-10-0-0-80

f:id:akiyoko:20160830001913p:plain
f:id:akiyoko:20160830001930p:plain

(参考)amazon web services - AWS error - sudo: unable to resolve host ip-10-0-xx-xx - Stack Overflow


 

2.2. Subnet の作成

CIDR が「10.0.0.0/24」のサブネットを作成します。

[Subnets] から、「Create Subnet」ボタンをクリック。

f:id:akiyoko:20160830001951p:plain

以下を設定します。

Name tag P1 Public #1
VPC P1
Availability Zone ap-notrtheast-1a
CIDR block 10.0.0.0/24

f:id:akiyoko:20160830002016p:plain


 

2.3. Internet Gateway の作成

インターネットゲートウェイを作成します。

[Internet Gateways] から、「Create Internet Gateway」ボタンをクリック。

f:id:akiyoko:20160830002038p:plain

名前を「P1 Public #1」に設定。
f:id:akiyoko:20160830002101p:plain

作成した Internet Gateway を選択して「Attach to VPC」ボタンをクリックし、作成した VPC を選択して、Internet Gateway を VPC に紐付けます。

f:id:akiyoko:20160830002124p:plain
f:id:akiyoko:20160830002146p:plain

[Route Tables] から、作成した VPC の Route Table を選択して、Routes を編集します。

f:id:akiyoko:20160830002204p:plain

以下を設定します。

Destination 0.0.0.0./0
Target 作成した Internet Gateway を選択

f:id:akiyoko:20160830002223p:plain
f:id:akiyoko:20160830002254p:plain


これで VPC の設定は完了です。


3. EC2 インスタンスの起動

3.1. SSH鍵の作成

まず、SSH鍵を作成します。

[EC2] > [Key Pairs] から、「Create Key Pair」をクリック。

f:id:akiyoko:20160910223728p:plain

キーペア名は、「aws_p1」としました。
f:id:akiyoko:20160910223833p:plain

作成すると、自動的に鍵がダウンロードされます。
f:id:akiyoko:20160910223853p:plain


ダウンロードした SSH鍵を .ssh 以下に配置します。
(以下の操作は Mac を想定しています。)

$ mv ~/Downloads/aws_p1.pem ~/.ssh/
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/aws_p1.pem
$ ls -l@ ~/.ssh/aws_p1.pem
-rw-------@ 1 akiyoko  staff  1696  6  5 17:35 /Users/akiyoko/.ssh/aws_p1.pem
    com.apple.metadata:kMDItemWhereFroms     199
    com.apple.quarantine      68
$ xattr -d com.apple.metadata:kMDItemWhereFroms ~/.ssh/aws_p1.pem
$ xattr -d com.apple.quarantine ~/.ssh/aws_p1.pem
$ ls -l@ ~/.ssh/aws_p1.pem
-rw-------  1 akiyoko  staff  1696  6  5 17:35 /Users/akiyoko/.ssh/aws_p1.pem

ここで、ダウンロードした際によく分かんない attribute(Extended Attributes と言うものらしい)が付いてしまっているので、削除しています。

(参考)EA (Extended Attributes) の消し方


 

3.2. EC2インスタンス用の Security Group 作成

EC2インスタンスに付与する Security Group を作成します。

f:id:akiyoko:20160910223918p:plain

以下を設定します。

Security group name P1 Webserver #1
Description P1 Webserver #1
VPC P1
Type Protocol Port Range Source
SSH TCP 22 My IP
HTTP TCP 80 My IP
HTTPS TCP 443 My IP

f:id:akiyoko:20160910223941p:plain


 

3.3. EC2 インスタンス用の IAM Role の作成

EC2インスタンス作成時に IAM Role を設定して起動するため、先に作成しておきます。

f:id:akiyoko:20160910224102p:plain

IAM Role の名前は「ec2-prod」(本番 EC2インスタンス用の Role という意味)としておきます。
f:id:akiyoko:20160910224124p:plain

「Role Type」は「Amazon EC2」を選択。
f:id:akiyoko:20160910224151p:plain

完全な管理者アクセス権限(AdministratorAccess)ポリシーを選択します。
f:id:akiyoko:20160910224226p:plain

「Create Policy」をクリックして、IAM Role の作成は完了です。
f:id:akiyoko:20160910224252p:plain


 

3.4. EC2インスタンスの起動

EC2インスタンスを起動します。

f:id:akiyoko:20160910224329p:plain

「Ubuntu Server 14.04 LTS」を選択。
f:id:akiyoko:20160910224351p:plain

インスタンスタイプは(必要に応じていつでもスケールアップできるので、最初は)「t2.micro」でよいでしょう。
f:id:akiyoko:20160910224416p:plain

以下を設定します。

Network P1
Subnet P1 Public #1
IAM role ec2-prod
Enable termination protection 「Protect against accidental termination」にチェック

f:id:akiyoko:20160910224442p:plain

f:id:akiyoko:20160910224508p:plain

インスタンス名を「P1 Webserver #1」とします。
f:id:akiyoko:20160910224525p:plain

3.2. で作成した Security Group を設定します。
f:id:akiyoko:20160910224552p:plain

f:id:akiyoko:20160910224616p:plain

3.1. で作成した SSH鍵を設定して、インスタンスを起動します。
f:id:akiyoko:20160910224643p:plain


 

3.5. Elastic IP の紐付け

最後に、起動した EC2インスタンスに Elastic IP を紐付けます。

[Elastic IPs]>[Allocate New Address]をクリック。
f:id:akiyoko:20160910224724p:plain

「Yes, Allocate」をクリックして、Elastic IP を払い出します。
f:id:akiyoko:20160910224751p:plain

払い出した Elastic IP を選択し、[Actions]>[Associate Address]をクリック。
f:id:akiyoko:20160910224815p:plain

3.4. で起動したインスタンスを選択して「Associate」をクリックし、Elastic IP を紐付けます。
f:id:akiyoko:20160910224835p:plain


f:id:akiyoko:20160910224945p:plain


ここで念のため、疎通確認しておきます。

$ ssh -i ~/.ssh/aws_p1.pem ubuntu@52.xx.xx.xx



 

4. SES の設定

最後に、メールの設定です。
なおここで、AWS 外のレジストラ(ここでは お名前.com)で独自ドメイン「akixxxx.com」を管理していることを前提しています。


まず最初に、Amazon SES は Tokyo リージョンでは対応していないため *2、「Oregon」リージョンに移動します。

f:id:akiyoko:20160910225033p:plain


 

4.1. ドメイン認証

[Domain] > [Verify a New Domain]でドメインを認証します。
f:id:akiyoko:20160910225132p:plain

Domain に「akixxxx.com」を指定します。
f:id:akiyoko:20160910225203p:plain

送信用の TXTレコードと受信用の MXレコードが表示されます。
f:id:akiyoko:20160910225231p:plain


 

4.2. 送信用 TXTレコードと受信用 MXレコード設定

レジストラ(お名前.com)上でドメインNavi にログインし、上記の送信用の TXTレコードと受信用の MXレコードを設定します。


[ドメイン設定] > [ネームサーバーの設定]>[DNS関連機能の設定]から、該当ドメインをチェックして「次へ進む」をクリック。
f:id:akiyoko:20160910225320p:plain

[DNSレコード設定を利用する]>[設定する]をクリック。
f:id:akiyoko:20160910225355p:plain

以下を設定します。

ホスト名 TYPE TTL VALUE 優先 状態
_amazonses.akixxxx.com TXT 3600 (AWS Management Console の Domain Verification Record の値を貼り付け) 有効
akixxxx.com MX 3600 (AWS Management Console の Email Receiving Record の値を貼り付け) 10 有効

なお、MXレコードの優先度は「10」にします(そのまま貼り付けるとダメ。「10」と「inbound-smtp.us-west-2.amazonaws.com」に分割する)。

f:id:akiyoko:20160910225430p:plain

f:id:akiyoko:20160910225513p:plain

f:id:akiyoko:20160910225552p:plain



2時間ほどすると、「Amazon SES Domain Verification SUCCESS」というメールが来ます。
f:id:akiyoko:20160910225630p:plain

ドメインのステータスが「verified」になっていることが確認できます。
f:id:akiyoko:20160910225710p:plain


 

4.3. SES 送信制限の解除申請

ステータスが「verified」になったら、「Request a Sending Limit Increase」の申請をします。

f:id:akiyoko:20160910225743p:plain


申請内容は以下の通り。

Regarding(内容) Service Limit Increase(サービス制限の増加)
Limit Type(制限タイプ) SES Sending Limits(SES送信制限)
Region US West (Oregon)
Limit Desired Daily Sending Quota(希望する一日あたりの送信クォータ)
New limit value 10000
Mail Type(メールの種類) System Notifications(システム通知)
Website URL (メール送信を使用するシステムのURLを指定)
My email-sending complies with the AWS Service Terms and AUP(私は AWS サービス利用規約と AUP に準拠してメールを送信します) Yes
I only send to recipients who have specifically requested my mail(私は明確にリクエストされた受信者にのみメールを送信します) Yes
I have a process to handle bounces and complaints(バウンスや苦情を処理するプロセスがあります) Yes
Use Case Description(申請理由の説明) アカウント登録やパスワード変更など、システムを利用するユーザへの通知に利用します。メール送信は基本的にシステムからの自動送信となり、ユーザ自身が登録したメールアドレス宛に送信するため、バウンスはほとんど発生しません。予想されるユーザ数は当面のところ、○○程度と見込んでいます。(あくまでサンプルですので、状況に合わせて適宜書き直してください。)
Support Language 日本語
Contact method Web(しか選択できません)

f:id:akiyoko:20160910225819p:plain

f:id:akiyoko:20160910225857p:plain


6時間くらい後に承認メールが届きました。
f:id:akiyoko:20160910230541p:plain

Congratulations! After reviewing your case, we have increased your sending quota to 50,000 messages per day and your maximum send rate to 14 messages per second in AWS Region US West (Oregon). Your account has also been moved out of the sandbox, so you no longer need to verify recipient addresses.

AWS Management Console 上はこのようになっています。
f:id:akiyoko:20160910230618p:plain


(参考)Amazon SESによるメール送信環境の構築と実践 | Developers.IO


まとめ

今回、AWS 環境構築として、

  • IAM 設定(ルートアカウント・admin ユーザの設定)
  • VPC 設定(1ネットワーク+ 1サブネット)
  • EC2 設定(Ubuntu 14.04 LTS インスタンスの起動)
  • Amazon SES 設定(ドメイン認証、送信制限の解除申請)

を実施した内容を記載しました。

次回は、Mezzanine 本番設定の第二弾として、「その2:Mezzanine テーマのカスタマイズ」について記載します。


 

参考本

AWS 関連で比較的新しくて良さげな本を紹介します。

*1:というか、1台のスマホにつき紐付けられるユーザは 1つだけなのかな??

*2:「米国西部(オレゴン)」のほか、「米国東部(バージニア北部)」「欧州(アイルランド)」でも SES を利用できますが、今回は日本から物理的に一番近そうな米国西部を選択しました。(参考)https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/regions.html 東京リージョンに対応しました。(参考)Amazon SES 東京リージョン対応のお知らせ | Amazon Web Services ブログ