第5回 The Twelve-Factor App on AWS & Django（AWSで初期設定をしようー前編）

# 目次
- [第1回 The Twelve-Factor App on AWS & Django（The Twelve-Factor Appとは）](https://qiita.com/satsuma0711/items/3b928d0e5670a633f9d8)
- [第2回 The Twelve-Factor App on AWS & Django（バックエンドAPIを作ろう）](https://qiita.com/satsuma0711/items/850d57ad1557d0f8dddb)
- [第3回 The Twelve-Factor App on AWS & Django（フロントエンドSPAを作ろう）](https://qiita.com/satsuma0711/items/67d35253a237c976415f)
- [第4回 The Twelve-Factor App on AWS & Django（AWSのアカウントを作成しよう）](https://qiita.com/satsuma0711/items/1482be82882652e6d314)
- 第5回 The Twelve-Factor App on AWS & Django（AWSで初期設定をしようー前編）　←　今回


# はじめに
[前回](https://qiita.com/satsuma0711/items/1482be82882652e6d314)の記事でAWSアカウントが作成できたので、今回はAWSを本格的に利用する前に不正利用を受けたりなどしないよう必要な初期設定を実施したいと思います。実施すべき設定が多いので、前半・後半の2回に分けてまとめたいと思います。


# ルートユーザーの保護
AWSで利用できるユーザーとしてルートユーザーとIAMユーザーがあります。

ルートユーザーとは、アカウントのAWSリソースに対して無制限のアクセス権限を持ち、アカウントの契約情報を変更したり解約したりもできるユーザーで、流出してしまうと最悪アクセスできなくなってしまうので、ベストプラクティスとして乗っ取りを受けないよう対策を行い、できるだけ普段はルートユーザーを利用しないように設定します。

IAMユーザーを作成し、作成したIAMユーザーを通常の開発・運用では利用するようにします。後程、IAMユーザーを作成します。

今回ルートユーザーを保護するためにMFA（多要素認証）を設定します。AWSマネジメントコンソールのホーム画面にアクセスします。アクセスできたら、「Recently visited」にある「IAM」をクリックします。もしなければ上部の検索ボックスに「IAM」と入力してアクセスして下さい。
![root_user_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/83fc709a-777b-b26d-71fd-d4097b5abd36.png)


IAMのダッシュボード画面にアクセスできたら、画面中部の「Add MFA for root user」にある「Add MFA」ボタンをクリックします。
![root_user_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/b4c7bb06-fbc3-7b18-d003-c8c29724d6c6.png)

MFAの設定画面にアクセスできたら、「Activate MFA」ボタンをクリックします。
![root_user_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/126e3be0-ec17-2d45-e4ca-991bd1c2cd5e.png)

MFAデバイスの種類を選択します。仮想デバイスと物理デバイスを選択できますが、物理デバイスの用意が難しい場合が多いと思うので、スマートフォンアプリ等で設定可能な仮想MFAデバイスを使用します。「Virtual MFA device」を選択し、「Continue」ボタンをクリックします。
![root_user_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/3475178f-8f76-a1ad-324f-1f1f5e171a70.png)

仮想のMFAデバイスとしてGoogle Authenticato‪r‬（Google 認証システム）を利用します。お手持ちのスマートフォンのOSに応じてインストールして下さい。
- iPhone：Google Authenticato‪r‬
- Android：Google 認証システム

Google Authenticato‪r‬（Google 認証システム）をインストールできたら、「Show QR code」をクリックし、QRコードを表示します。QRコードを表示できたら、Google Authenticato‪r‬（Google 認証システム）でスキャンします。
![root_user_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/18612bf6-0656-4892-7303-dcc21a9c1054.png)

スキャンできたら、Google Authenticato‪r‬（Google 認証システム）にワンタイムパスワード（6桁の数字）を表示するようになり、30秒ごとに新しいワンタイムパスワードに切り替わります。表示中のワンタイムパスワードを「MFAコード1」に入力し、続けて表示する新しいワンタイムパスワードを「MFAコード2」に入力して「Assign MFA」ボタンをクリックします。
![root_user_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/909e9646-cd87-8e86-ae8e-ef4eb32c9ae1.png)

無事ルートユーザーにMFAを設定することができました。「Close」ボタンをクリックします。
![root_user_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/020de9bb-b7e2-ac9b-9ee8-78afcd44fb70.png)

ルートユーザーにMFAデバイスが設定済みであることを確認できます。
![root_user_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/b8c46d30-66a4-8130-fe46-69ec5fedadf2.png)

一応、ルートユーザーで「Access keys（access key ID and secret access key）」を展開して、アクセスキーとシークレットアクセスキーを設定していないことを確認します。
![root_user_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/ac7d4773-bf3a-753c-1cf5-0bbec02eb101.png)

IAMのダッシュボード画面にアクセスすると、Security recommendationsが全てOKになっていることを確認できます。
![root_user_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/dee4d4f6-dadf-c139-aaac-71bcb5e2134b.png)

設定が完了しました。次回以降ルートアカウントでログインすると、MFAコードを入力しないとログインできないようになりました。
![root_user_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/99b3a44c-9b3e-982d-5ead-69d9a79c422d.png)


# 請求情報を設定変更する
請求情報にデフォルトではルートユーザーでしかアクセスできないので、IAMユーザーでもアクセスできるようにします。

右上のアカウント設定から「Account」をクリックします。
![billing_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/80372efe-58e2-a708-a4d2-63f27af1acd9.png)

アカウントの設定画面にアクセスできたら、「IAM User and Role Access to Billing Information」へ移動し、「Edit」をクリックします。
![billing_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/04336ce1-8c97-9b67-c8f1-ee0601cba3a3.png)

編集画面に切り替わるので、「Activate IAM Access」にチェックをつけて「Update」ボタンをクリックします。
![billing_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/dd439054-df80-52a2-141a-9f189ce816f9.png)

請求情報にIAMユーザーでもアクセスできるようになりました。
![billing_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/62ed1a1b-342e-4476-176d-d41337c802a5.png)


# 管理者のIAMユーザーを作成
IAMを利用すると、個人ごとにユーザーを発行するので、操作ログを追跡することができ、それぞれ必要な権限のみを設定することができます。だから、最悪認証情報が流出しても許した権限のみしか操作できないので、被害を限定的にできます。

ルートユーザーは使用しないようにしましたので、まずは管理者となるIAMユーザーを作成します。

IAMのダッシュボード画面にアクセスし、メニューにある「User Groups」をクリックします。
![iam_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/4492111b-ccce-6489-54a1-2624775451a0.png)

「Create group」ボタンをクリックします。
![iam_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/3a14a89a-56d8-8cc6-da72-2f6778379fb5.png)

グループの名前を入力し、作成するグループにアタッチするポリシーを選択します。今回グループの名前を「Administrator」とし、アタッチするポリシーとして「AdministratorAccess」を選択します。「Create group」ボタンをクリックします。
![iam_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/a37aa86c-0fe2-6577-a027-ba5a252b6cae.png)

「Administrator」グループが作成できました。続いて、IAMユーザーを作成します。ナビゲーションメニューにある「Users」をクリックします。
![iam_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/8a2a5941-0511-96eb-5b4c-9b623132b024.png)

ユーザーの名前を入力します（今回Admin）。「Select AWS credential type」では「Password - AWS Management Console access」をだけを選択し、「Console password」では「Autogenerated password」を選択します。最後に「Require password reset」にチェックが付いていることを確認して「Next: Permissions」ボタンをクリックします。
![iam_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/53f032a4-3d2b-b244-3698-51dc8d83f8b3.png)

ユーザーの所属グループを選択します。Administratorグループにチェックが付いていることを確認して、「Next: Tags」ボタンをクリックします。
![iam_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/97db1a08-a2e3-99a1-4e46-86a82a072047.png)

タグはひとまず不要なので、何も入力しないで、「Next: Review」ボタンをクリックします。
![iam_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/18f3e8cd-04e3-db74-70b1-960e8da6b3ff.png)

作成するユーザーの設定を確認して、「Create user」ボタンをクリックします。
![iam_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/30002a41-8d61-da97-d23e-f8c6238cd1b0.png)

IAMユーザーが作成できました。「Download .csv」ボタンをクリックして、作成したユーザーの認証情報をダウンロードします。ダウンロードしたファイルは大切に保管しましょう。
![iam_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/6f64a284-b396-e347-cb05-8ba0674de857.png)

IAMユーザーが作成できたことを確認できます。
![iam_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/402b9d70-00e1-941b-2602-093a2c4d9c0c.png)

一旦ルートユーザーはログアウトして、作成したIAMユーザーでログインしましょう。先程ダウンロードしたファイルにある認証情報を使ってIAMユーザーとしてログインします。
![iam_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/634fbbd7-58f5-d0a6-0e02-c9700b2a6f28.png)

初回ログインするとパスワードの変更画面に遷移するので、新しいパスワードを入力します。
![iam_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/c125df7b-69ab-46b0-b4ae-08fb615bd1e0.png)

IAMユーザーで無事ログインできました。
![iam_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/79ef3a72-abea-7c34-fe8a-dcbc5ded6977.png)

今回作成したadminユーザーは「AdministratorAccess」という強力な権限を持つので、ルートユーザー同様MFAを設定します。アカウントの設定メニューから「Security credentials」をクリックします。
![iam_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/e8491548-03d7-8b34-5905-d5bbedd27caa.png)

アカウントの設定画面にアクセスできたら、「Assign MFA device」ボタンをクリックします。
![iam_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/34050789-5b68-cc39-db67-2b5814525921.png)

ルートユーザーでMFAを設定したのと同様の操作でMFAを設定します。
![iam_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/6104b976-1f19-734c-0ce5-f8251802d02e.png)

MFAを設定することができたら、「Close」ボタンをクリックします。
![iam_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/f7faf21a-acf6-d2fc-f6a8-710a2dc7504f.png)

MFAを設定できたことを確認するため、一旦ログインし直します。
![iam_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/2b8a6201-0520-721c-a6ea-a736bc9f2b60.png)

IAMユーザーによるログインでもMFA認証画面を表示することが確認できました。
![iam_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/d07d73ff-f68f-ef25-9a18-6db51341999d.png)


# 請求の設定
AWSからの請求書をPDFファイルで受領できるよう請求の設定を行います。

アカウントの設定メニューで「Account」をクリックします。

![billing_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/e137943f-4c04-9450-99ef-a10af48cc07c.png)

アカウントの設定画面に遷移するので、ナビゲーションメニューで「Billing preferences」をクリックします。「Receive PDF Invoice By Email」と「Receive Free Tier Usage Alerts」にチェックを入れ、メールアドレスを入力します。

![billing_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/c6a44fc1-7320-c717-775b-a3d4c2e6d984.png)

入力できたら、「Save preferences」ボタンをクリックします。

# 予算の設定
想定外の請求料金が発生しないようBudgetsを活用して、設定した予算を超える場合にアラートメールを送信するようにしましょう。

引き続き、ナビゲーションメニューで「Budgets」をクリックします。

AWS Budgets画面に遷移します。「Create a budget」ボタンをクリックします。
![budget_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/74c4b6bf-e07e-7c92-ae9f-59ff00b1f64b.png)

予算の種類を選択する画面に遷移します。「Enable Cost Explorer」ボタンをクリックしCost Explorerを有効化します。クリックすると新しいタブで「Cost Explorer」の起動画面に遷移します。

「Cost budget - Recommended」が選択済みであることを確認して、「Next」ボタンをクリックします。
![budget_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/ecf1885a-6802-7abd-ab60-019669c70765.png)

予算の設定画面に遷移します。以下を入力します。入力できたら、「Next」ボタンをクリックします。
```
「Budget　name」：識別しやすい予算の名前
「Period」：「Monthly」
「Budget renewal type」：「Recurring budget」
「Start　Month」：現在の月
「Budgeting method」：「Fixed」
「Enter　your budgeted amount($)」：予算金額（今回はアラートメールが届くことを早く確認するため$1）
```
![budget_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/665cb9fa-9f02-865f-edca-8970a5238c7d.png)

アラートの設定画面に遷移します。「Add an alert threshold」ボタンをクリックします。
![budget_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/fd485c55-6c4e-485f-8412-e69de306cdb1.png)

アラートの閾値を設定するパネルを展開します。以下を設定します。入力できたら、「Next」ボタンをクリックします。
```
Threshold：80% of budgeted amount
Trigger：Actual
Email recipients：自分のEメールアドレス
```
![budget_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/f7e49643-f578-ab35-61f3-433ce99431b8.png)

アクションの追加画面に遷移します。何も入力しないで「Next」ボタンをクリックします。
![budget_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/d06440f3-832f-f90f-4118-37764672125b.png)

予算設定の確認画面に遷移します。問題なければ「Create budget」ボタンをクリックします。
![budget_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/d891faa8-b8a4-c321-1847-b319378af0ec.png)

作成が完了し無事予算設定できたことが確認できます。
![budget_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/e6e67647-4a06-b5ca-de62-13b2f05a3e98.png)


# Cost Explorerの設定
コストをより詳細（時間単位とリソースレベル単位）に確認できるよう設定します。

引き続き、ナビゲーションメニューで「Cost Explorer」をクリックします。「Launch Cost Explorer」ボタンをクリックします。
![cost_management_preferences_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/b5bbd77b-c91c-4ae3-5609-a3b4fe6c3c06.png)

新しいタブで「AWS Cost Mangement」画面に遷移するので、ナビゲーションメニューの「Preferences」をクリックします。

「Hourly and Resource Level Data」と「Receive Amazon EC2 resource recommendations」にチェックをつけて「Save preferences」ボタンをクリックします。
![cost_management_preferences_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/6beabdbb-b9d2-3091-936c-62a81de39c9c.png)

設定が完了しました。
![cost_management_preferences_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/9f62a76a-ffdb-416c-a84d-6aa2c1f2d360.png)


# Cost Explorerの有効化
引き続き、ナビゲーションメニューにある「Cost Explorer」をクリックします。

初回アクセスではまだデータがないため画面表示ができません。24時間後にまたアクセスして表示できることを確認しましょう。

![cost_management_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/aad0b284-46da-2579-16bd-c3456462f1c7.png)

![cost_explorer_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/b66aeca5-ec2f-90b3-ac16-cf1db9b18eb4.png)

結局、24時間では切り替わらないで、4日後にまたアクセスすると、コストを表示できるようになりました。

![cost_explorer_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/f59f1c68-17fe-c443-a2ed-d7d1bc7158e6.png)

![cost_explorer_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/921c2bb5-58a1-16db-71ad-ddf3750a448e.png)

# 最後に
AWSを本格的に利用する前に必要な初期設定（前半）が完了しました。今回は主にアカウントや請求周りの設定を行い、以上でアカウントの乗っ取りを防止できるようになりました。

次回は、セキュリティ周りの設定を行いたいと思います。