お名前.comでドメインを取得して、AWSで管理して、色々やってみる

#**初めに!**
この記事はAWSアドベントカレンダーに登録されています。本公開日は12/25になっています。
ですので、この記事は随時更新し完成は12/25を目処にしています。

#目次
-初期設定-
・お名前.comでドメインを取得
・AWS Route53でドメイン委任
・ACMでワイルドカード証明書を取得
-静的ウェブ編-
・S3にファイルをアップロードして静的サイトを取得したドメインで公開
-動的ウェブ編-
・EC2にElasticIPを与えEC2でWebサーバー運用
・ELBを追加しSSL証明書の設定をする
-メール編-
・SESにドメインを登録し、制限解除
・WorkMailでメール運用
-おまけ-
・Route53でドメイン取得
・S3で作成したサイトにBASIC認証をかける
・WorkMailを使わず、届いたメールを元々持っているメールアドレスに転送する、サーバーレスメール運用


#初期設定
##お名前.comでドメインを取得
AWSで独自ドメインのメールアドレスやWebサーバーの管理をするには、まずドメインの取得が必要です。
ドメイン取得は色々な所ででき、中には期間無料でドメインを取得できる[サイト](http://www.dot.tk/ja/index.html)などもありますが、今回は日本最大手の[お名前.com](https://www.onamae.com/)を使用します。
まず、上記リンクからサイトへアクセスし、取得したいドメインで検索をします。今回の説明では、hell0wannabeという名前で、.workのドメインを用います。<img width="957" alt="スクリーンショット 2018-11-13 21.24.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/80b4a5df-67d4-cd80-5d5f-14767964c39a.png">
検索をすると、このようにどのドメインで取得するかを選択する画面へ移動します。欲しいドメインにチェックを入れ、料金確認へ進みましょう。
サーバー関係はAWSを用いるので、下にあるオプションは利用しないを選択します。
<img width="1047" alt="スクリーンショット 2018-11-13 21.27.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/5dad83a0-e9e2-7850-ac6a-44a77ba288ba.png">
初めて利用する方はアカウントを作成し、既に持っている場合はログインをして進みます。
また、今回は最小設定で購入しますが、必要に応じて設定を変更していきましょう。
<img width="1059" alt="スクリーンショット 2018-11-13 21.31.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b88a11ca-af60-5eff-ed0a-5aae9ec689c4.png">

---
Whois情報公開代行メール転送オプションとは、本来ドメインを取得した場合、個人情報を登録する必要があります。その結果、第三者がドメイン管理者の個人情報にアクセスできる状態になってしまいます。お名前.comでは、プライバシー保護により、Whoisで閲覧できる情報を、管理者の個人情報から、お名前.comの情報に変えて掲載されます。ですので、ドメインからWhoisを用いて、管理者に連絡を取ろうとする第三者がいた場合、管理者のメールアドレスが分からず、連絡が取れなくなる場合が考えられます。その時に、このオプションを入れておくと、そこに届いたメールが登録時のアドレスに転送されるようになります。
ドメインプロテクションは、説明通り、　管理画面での設定を制限することで、誤設定防止や、第三者による不正ログインでの被害を抑える事が出来ます。

---
少し待つと、ドメインの申し込みが終了し、メールが届きます。
<img width="396" alt="スクリーンショット 2018-11-13 21.40.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/4be965e1-9739-201e-7e9a-a57047ff85b2.png">
これにて、お名前.comでドメインを取得出来ました。次はネームサーバーをRoute53に向けて、管理をAWS上で行うための設定をします。

##AWS Route53でドメイン委任
「ドメインの設定をする方はこちら」から、ドメイン設定画面へ移動し、移動先ページのフッターからドメイン一覧を選択します。
<img width="840" alt="スクリーンショット 2018-11-13 22.06.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/0b7d6814-ab1e-ed0c-eb60-70c51dc39648.png">
先程購入したドメインの、ネームサーバーと書かれた列に、初期設定と表示されているはずですので、そちらをクリックし、設定ページへ行きます。
<img width="998" alt="スクリーンショット 2018-11-13 22.07.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/3bc261cf-668b-c48e-b80a-47db6d693553.png">
その他を選択し、ネームサーバーを1つ追加し、4つになった状態でこの画面は待機します。
<img width="833" alt="スクリーンショット 2018-11-13 22.08.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/7ac37058-6173-b47e-45cd-ac3794a28a53.png">
次は別タブから[AWSマネジメントコンソール](https://console.aws.amazon.com/console/home)へ行き、Route53を開きます。
左ペインから、HostedZoneを選び、CreateHostedZoneを押しホストゾーンの作成をします。
ボタンを押すと、画面左にこのような項目が現れます。
<img width="460" alt="スクリーンショット 2018-11-13 22.15.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/674365a4-e712-33cc-ffe1-0c67b80bf668.png">
Domain Nameに先程取得したドメイン名を入力しましょう。
任意のコメントを入力します。
Createを押すとページが切り替わります。
遷移先ページのNSレコードにある4つのDNSを、先程待機していたお名前.comの画面に入力します。
<img width="544" alt="スクリーンショット 2018-11-13 22.17.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/1bd819d8-7911-b707-e83d-6e4bc6b32115.png">

<img width="802" alt="スクリーンショット 2018-11-13 22.19.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/eaa3561c-d75d-fc64-ad41-9b7046be8fb5.png">

これで設定は完了です。24~72時間後に反映されるらしいので、気長に待ちます。
また、今後レコード設定などをする場合は、Route５３の方で設定できるようになります。

##ACMでワイルドカード証明書を取得
設定が終わったら、CertificateManagerのページへ行き、SSL証明書の発行をします。
バージニア北部(us-east-1)リージョンで作業をしてください。CloudFrontで証明書を使用するには、バージニアである必要があるためです。詳しくは[こちら](https://aws.amazon.com/jp/certificate-manager/faqs/)
証明書のリクエストを押し、パブリック証明書をリクエストします。
<img width="373" alt="スクリーンショット 2018-11-13 22.25.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/66d2aec4-a9bc-f74c-cca3-00c94ce710b1.png">
**ここで、ドメイン名の指定を、画像のように入力するとワイルドカード証明書というものになり、`www.hell0wannabe.work`や`test.hell0wannabe.work`のように、アスタリスクの部分を任意に選択できる証明書になります。**
次へを選択し、検証方法を選択します。今回はDNSの検証で進めます。
<img width="1089" alt="スクリーンショット 2018-11-13 22.27.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/5399f98c-e65a-66ca-37a2-a7b98730ee7e.png">

---
先程お名前.comでドメインを購入する際、Whois情報公開代行メール転送オプションを含めていた場合、メールでの検証でも進めることが出来ます。その場合、以下の手順をスキップし、登録時のメールに届く内容に従って手続きを進めていってください。

___
画面どおり進めて行くと、レコードを追加しろと指示されます。
<img width="2653" alt="スクリーンショット 2018-11-13 22.29.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/77f52e01-5d39-914a-2a2b-1c58575ba99e.png">
Route53でのレコードの作成を押すと、ワンクリックで設定が終わるので、手作業で登録するのが面倒な人は押しましょう。
手作業で進めるなら、先程のRoute53の画面にCreateRecordSetというボタンがあるので、それを押し、右側に表示された項目を、上記で表示されてるように入力し、レコードを登録します。
しばらく待つと、この状況が発行済になります。こちらも時間がかかるので気長に待ちましょう。<img width="981" alt="スクリーンショット 2018-11-13 22.32.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b9437944-6211-4650-11bb-0c5e77353c6c.png">

#静的ウェブ編
##S3にファイルをアップロードして静的サイトを取得したドメインで公開
今回はwww.hell0wannabe.workの名前で公開します。
名前とリージョンだけ設定して、S3バケットを作成します。
<img width="1080" alt="スクリーンショット 2018-11-13 22.43.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/23f0d032-ccdf-a76d-730c-c2b26f3a8de4.png">
Webページを作るような、フロントエンド周りの知識は皆無なのでHelloWorldと表示されるだけの単純なindex.htmlを作り、S3にアップロードします。
<img width="1092" alt="スクリーンショット 2018-11-13 22.44.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/26b8cb9b-1afe-778c-33fe-733ec41062ee.png">
S3にアップロードが出来たら、CloudFrontの設定に移ります。
CloudFrontから、Create Distributionを押し、WebのDistributionを作成していきます。
OriginSettingsでは、以下のように設定します。
OriginDomainNameは先程作ったS3バケット、OriginIDは自動入力のまま、RestrictBucketAccessはYes、OriginAccessIdentityはCreate a New Identityを選び、GrantReadPermissions on BucketはYesを選びます。
<img width="991" alt="スクリーンショット 2018-11-13 22.46.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/68cd5293-0b64-6fb1-37ca-ddb3aa95e362.png">
これで、先程のS3バケットには、このCF経由でのみアクセス可能になり、S3バケットの設定は自動で書き換えられます。
DefaultCacheBehaviorSettingsは以下のように。
<img width="984" alt="スクリーンショット 2018-11-13 22.52.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/109347ad-70bc-f733-a4c1-b431d25bd05d.png">
ViewewProtocolPolicyをRedirect HTTPtoHTTPSに変え、ObjectCachingをCustomizeにし、TTLの設定を全て0に変えたのみで、あとはデフォルトのままです。
DistributionSettingsはこのようにしましょう。ここでの設定を間違えると、SSL証明書やアクセス時に表示されるページがおかしくなるので、しっかりやりましょう。
<img width="1149" alt="スクリーンショット 2018-11-13 22.55.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/a6b45537-0cb6-9dd2-4f9d-38e48edcfcb6.png">
CNAMEsに公開する時の名前を入力し、SSLをカスタムに、入力欄を押すと先程のSSL証明書が入力できるのでします。もし何も表示されない場合は、SSL証明書が発行済みになっているか確認してください。
DefaultRootObjectには先程アップロードしたindex.htmlを選び、これでDistributionの設定は終わったので作成をします。
このIn ProgressがDeployedになったら、Route53でレコードの設定をします。Deployedになるまでは、また時間がかかるので気長に待ってください。
<img width="1913" alt="スクリーンショット 2018-11-15 14.37.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/ab899f72-16c0-d387-683d-7a913899a7bf.png">
Deployedになったら、Route53でレコードを作成します。
<img width="414" alt="スクリーンショット 2018-11-15 14.44.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b4a2fd71-a522-70bb-dc88-8c380c8693b0.png">
Aレコードエイリアスでwwwを先程のCloudFrontへ向けてください。
そうすると、先程のURLでindex.htmlが表示されるはずです。されない場合、少し時間をおいてみましょう。
これでS3ウェブを独自ドメインで運用できるようになりました。
ちなみにこれってサーバーレスになるんでしょうか?詳しい方いたら教えてくださいm(_ _)m

#動的ウェブ編
##EC2にElasticIPを与えEC2でWebサーバー運用
VPCはデフォルトの使います。

VPCもイチから作りたいって人は[私の過去の記事](https://qiita.com/wannabe/items/ae88f6ccaddc7041acae)を読んでください。
あと上の記事では、おそらく被らないだろうって事で123.45.0.0なんて適当なアドレス使ってますが、慣例として10.0.0.0か172.16.0.0か192.168.0.0のどれかを使う方が良いんじゃないでしょうか、まぁ今クラスレスの時代なので好きなアドレスで構わないでしょう。
閑話休題

まずEC2インスタンスを建てましょう。今回はwordpressで調べればAWS Marketplaceに表示される、このAMIを選びます。
<img width="1165" alt="スクリーンショット 2018-11-15 16.17.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/0737440b-0d59-5b95-4ff0-3157bf1b2687.png">
無料枠なのでt2.microで
<img width="759" alt="スクリーンショット 2018-11-15 16.19.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/e35f7233-c27f-0699-7d94-82407f69dcc5.png">
詳細設定をデフォルトのまま進めて、セキュリティグループでSSHをマイIPに変更しましょう。
<img width="1910" alt="スクリーンショット 2018-11-15 16.20.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/24649139-2168-f524-627c-f46b54cead8d.png">
そのまま進めていき、既存のキーペアあるならそれを使いましょう。今回は新しく作ります。
任意のキーペア名を入力し、ダウンロード。
<img width="693" alt="スクリーンショット 2018-11-15 16.21.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/76a723a6-29ef-9f68-a444-0f686e66d5ad.png">
インスタンスが起動したら、パブリックDNSをコピーし、ブラウザに入力しましょう。WordPressのHelloページが表示されるはずです。
<img width="1981" alt="スクリーンショット 2018-11-15 16.26.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/ff24ea93-c5c0-8577-a8ba-ed6de2a2cf72.png">
WordPressのHelloページが表示されたら、URLに`/wp-admin/`の文字列を追加しましょう。私の場合`ec2-54-86-82-197.compute-1.amazonaws.com/wp-admin/`になります。
そうするとWPのログイン画面が表示されるので、次はパスワードを取得しに行きましょう。今回のように作成した場合、ユーザー名は`user`です。
先程のEC2の画面から、インスタンスを選択した状態で、アクション→インスタンスの設定→システムログの取得を選択していきます。
黒背景に緑文字の、マトリックスみたいな画面が小さく表示されると思うので、そこから写真のような項目を探します、下の方にあります。
<img width="617" alt="スクリーンショット 2018-11-15 16.35.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/45a64984-88e3-cb55-d848-258c6eea8911.png">
to の後に書いてある文字列がパスワードですので、WPのログイン画面にコピペします。
<img width="378" alt="スクリーンショット 2018-11-15 16.37.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/21733008-e1b9-8fc8-fa43-6c186445312f.png">
これでログインできました。

インスタンスにSSHで接続したい場合は以下の手順を踏んでください。
ご自身の環境でCLIを開き、pemファイルをダウンロードしたディレクトリに移動し、(またはワーキングディレクトリまでpemファイルを持ってきてから)`chmod 400 YOUR_KEY_NAME`とコマンドを入力しておきましょう。
インスタンス内に入るには、chmodのコマンドを入力した後、EC2のダッシュボードにある接続ボタンを押して、sshから始まる行をCLIにコピペすると接続できます。
<img width="714" alt="スクリーンショット 2018-11-15 16.40.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/99ab4bc9-0774-5ffc-e427-a402a1b4419b.png">
これでSSH出来ます。後は好きなようにいじってください。

では、次にElasticIPを取得し、Route53の設定をします。
EC2のダッシュボード画面の左ペインにElasticIPとあるので、そこをクリック。
新しいアドレスの割当を選択し、設定を変更せずに進めます。
<img width="1298" alt="スクリーンショット 2018-11-15 16.41.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/e94260bc-d0ea-b6d5-8e2f-3a60da0e0850.png">
アドレスが割り当てられたら、インスタンスに関連付けさせます。
<img width="1294" alt="スクリーンショット 2018-11-15 16.42.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/8cc1163a-3e6e-e972-17df-8b7589cfebd3.png">
関連付けをすると、パブリックDNSが変わるので、先程アクセスしたWPのURLやSSHのアクセス先が変わるので注意してください。
では、そのままRoute53のレコードを追加しに行きます。ElasticIPをコピーしておいてください。
レコードは、Aレコードで、バリューに先程のElasticIPを貼り付けましょう。
ホスト名wwwはS3の時に使ったので、別の名前にしましょう。今回はわかりやすくec2にしています。
<img width="408" alt="スクリーンショット 2018-11-15 16.46.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/23b69e6f-cd8c-2ed2-6fbe-38c0bd736563.png">
これにより、ec2.hell0wannabe.workにアクセスするとWPの画面が見れるようになります。

##ELBを追加しSSL証明書の設定をする
EC2のダッシュボードからロードバランサを選択し、新しいロードバランサの作成で、ApplicationLoadBalancerを選択します。
<img width="2986" alt="スクリーンショット 2018-11-15 17.05.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/c8dfae8a-8fc4-b2c5-a4e1-6dceda8af585.png">
任意の名前と、プロトコルにHTTPSの追加、AZを2つ以上選択し、次へ
<img width="1866" alt="スクリーンショット 2018-11-15 17.06.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/aac8775c-1cc9-d89f-f9f8-4dfe20551359.png">
ACMから、上で作成した証明書を選択し次へ
セキュリティグループはEC2インスタンス作成時に同時作成されたものを選び次へ
<img width="556" alt="スクリーンショット 2018-11-15 17.07.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/841f1a4c-2106-a638-5a41-7a622d0f6d71.png">
任意の名前を入れ、プロトコルをHTTPSにし、次へ
<img width="1629" alt="スクリーンショット 2018-11-15 17.08.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b00b5fe5-9495-fbc2-f12f-0fa216cbccd4.png">
先程のインスタンスを登録済みに加え、次へ
そのまま作成へ
Route53のレコード設定へ行き、ElasticIPを設定したAレコードを編集
<img width="411" alt="スクリーンショット 2018-11-15 17.11.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b647750b-bd88-6c18-98f8-c834c7ee48c3.png">
エイリアスを選び、ELBから先程作成したLoadBalancerを選択
しばらく待ち、https://のプレフィクスをつけてアクセスすると証明書が適用された状態になります。

#メール編
##SESにドメインを登録し、制限解除
SESのダッシュボードへ移動し、左ペインからDomainを選択します。
Verify New Domainから、取得したドメインと、DKIM云々にチェックを入れ確認。
<img width="763" alt="スクリーンショット 2018-11-15 17.20.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/23b369a7-d6c8-4b52-fb81-e63b9c491e5a.png">
色々と出ますが、右下のUseRoute53を押し、全てにチェックを入れ、Createすると一発で終わります。手作業で一つ一つ入力しても構いません。
<img width="841" alt="スクリーンショット 2018-11-15 17.22.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b40f4758-2e9a-ed1a-cb16-6f79db51977b.png">
ちょっと待つとVerifiedになるので、待ちましょう。
<img width="2311" alt="スクリーンショット 2018-11-15 17.23.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/80cb2f81-538a-6df8-2d88-17ea2bdc26eb.png">
左ペインのSending Statisticsの項目からSandBoxの制限解除のメールをAWSに送信しましょう。以下の画面を参考にして制限解除をリクエストしてください。以前私がリクエストした時のスクリーンショットです。
また、リクエストには日次送信クォータと最大送信レートが選択できますが、大きい値になるほど、リクエストが受理される難易度(?)が上がります、サンドボックスの解除のみなら、日次送信クォータを200で設定するか、最大送信レートを1で設定してください。
<img width="1237" alt="スクリーンショット 2018-11-15 17.29.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b1448702-6b48-8328-6025-0f75a6ccdfbe.png">
もちろん、理由次第ではハネられる事もあるので、しっかりと理由付けしていきましょう。
おそらく１日以内に結果のメールが届きます。解除されれば、Sending Statisticsの画面から、SandBoxであることの通知が消えてるはずです。
消えてれば成功です。

##WorkMailでメール運用
WorkMailのダッシュボードへ飛び、AddOrganizationをクリック。
QuickSetUpを押し、任意のOrganizationNameを入力し、作成
<img width="1683" alt="スクリーンショット 2018-11-15 17.33.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/ce2f4bea-b845-dc74-73c0-9f09e30c50e5.png">
StatusがActiveになると設定ができるので、しばらく待機
名前をクリックすると、設定画面に移動するので、Domainへ行き、AddDomain
<img width="1384" alt="スクリーンショット 2018-11-15 17.38.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b626d7e4-8041-cba0-8534-0a6285ed4a05.png">
取得したドメインを入力し、次へ
SESの設定を済ましているので、一部のレコードは確認済みになっています。MissingになっているレコードをRoute53に追加しましょう。手作業です。
<img width="1414" alt="スクリーンショット 2018-11-15 17.39.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/4dbd188d-fcf3-daac-5b8c-4fd753e3a6ff.png">
全部確認し、Closeします。成功してるとこう表示されます。
<img width="542" alt="スクリーンショット 2018-11-15 17.43.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/c4aa8bfa-78dc-44e5-d9d5-4820f43b8436.png">
ではユーザーを登録しましょう。UserからCreateUser
<img width="1388" alt="スクリーンショット 2018-11-15 17.36.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/ca6ae722-2d3c-d0fd-03ce-69994a441e8a.png">
UserNameがメールアドレスのローカル部になります。任意のものを入力し、次へ
ドメインを、登録したものを選択し、パスワードを入力
<img width="762" alt="スクリーンショット 2018-11-15 17.45.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/ad208f66-0155-d4d9-e89e-df3fb412fa2b.png">
AddUserを押し、Successが出たら左ペインのOrganization Settingsから画面に表示されてるURLをクリック
<img width="931" alt="スクリーンショット 2018-11-15 17.46.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/923aa36d-9119-25d0-56cc-8b59e9a73e23.png">
先程のユーザー情報でログインができれば成功です。
<img width="377" alt="スクリーンショット 2018-11-15 17.47.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/199de8b8-7efa-e87d-a5d1-cf0ccf102c82.png">

#おまけ

##Route53でドメインを取得
Route53の左ペインからRegistered domainsを選択し、ドメインを登録していきます。
Route53でドメイン取得がなぜおまけ扱いかっていうと、見てみたらわかりますが**高額な料金設定**なためです。
.comくらいじゃないですか?他の所と大差ないドメイン。一通り見て、多分この.me.ukが最安置の$8だと思います・・
<img width="1685" alt="スクリーンショット 2018-11-15 17.57.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/f955035f-2c73-63eb-3f2b-643c3cbade2a.png">
選択したらcheckを押し、使用できるか確認します
<img width="831" alt="スクリーンショット 2018-11-15 18.00.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/5d939582-180e-38fe-4f3f-3cd7e6892b28.png">
使用できそうなのでAddCartして先に進みます。**と思ったのですが、ukドメインって色々と面倒臭いことを思い出したので高かろうと大人しく別のドメインを選びましょう**
てことで.netドメインに変更します。
メールアドレスの確認があるので、使えるアドレスを入力しましょう。
個人情報を入力し、次へ進むと確認画面になります。まずアドレスの確認をし、真ん中あたりの項目にチェックをいれ、CompletePurchase
私はAWSのバウチャーを持っていて、それを登録していましたが、今回の支払いには使えないから、クレジットカードなどの方に料金を請求するが良いか？との通知が出てきました。
全員でるものかわかりませんが、表示されたらチェックをいれ進みましょう。
<img width="587" alt="スクリーンショット 2018-11-15 18.14.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/d53b13e7-b9fd-35a3-46d2-643f2579b8b4.png">
PendingRequestのページにドメインが追加されました。確認が完了すると、登録済みになり、ドメインの購入が完了します。
HostedZoneに追加されるので、後は上でやったように設定していくことが可能です。

##S3で作成したサイトにBASIC認証をかける
私自身がCloudFront + Lambda@edgeでBasic認証をかけるという作業をしたことがあるのであくまでナレッジ共有ということで書かせていただきます。
us-east-1でLambda関数を作りましょう。
<img width="2845" alt="スクリーンショット 2018-11-15 15.41.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/b797ce8e-3aa3-e0ee-1dc1-496279b83d50.png">
関数名とロール名は任意のもの、ランタイムはNodeJS8.10、ロールは1つ以上の(以下略 を選んで、ポリシーテンプレートから基本的なLambda@Edgeの(以下略 を選んで作成します。
次にDynamoDBを作成します。DBに登録されているユーザーのみログインできるという仕組みを作ります。
<img width="493" alt="スクリーンショット 2018-11-15 15.19.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/aff8b353-b029-b93a-d0ba-61a6e09073fe.png">
任意のテーブル名と、userというプライマリキーを設定します。
このまま作成し、項目から新しい項目を追加します。
Append→Stringを選び
<img width="267" alt="スクリーンショット 2018-11-15 15.21.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/200ad258-6c4d-6e09-cc53-4212024e8b29.png">
新しく追加された項目のキーをpassにします。バリューは任意のものを入力します。
<img width="218" alt="スクリーンショット 2018-11-15 15.21.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/69411960-c92b-3c06-8c83-5d0ce76d6246.png">
今回は{user1:pass1}のようにします。
概要にある、ARNをコピーしてIAMに飛び、Lambda関数作成時に同時作成されたロールにアタッチするポリシーを作成します。
ポリシーには、
ClouｄWatchLogsの
・PutLogEvemts
・CreateLogGroup
・CreateLogStream
を全てのリソースに、
DynamoDBの
・GetItem
を先程コピーしたARNを貼り付けて追加しましょう。
<img width="1197" alt="スクリーンショット 2018-11-15 15.45.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/95ffafd7-f602-f495-2f26-6022aa2c255a.png">
任意のポリシー名を入力し、作成します。
<img width="1236" alt="スクリーンショット 2018-11-15 15.48.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/11945577-31a4-5931-1bca-ed31e5a481cb.png">
次に、先程作ったロールにこのポリシーをアタッチします。
ロールを選択し、ポリシーをアタッチします。
Lambda関数に戻ると、このようにDynamoDBが追加されています。
<img width="1331" alt="スクリーンショット 2018-11-15 15.29.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/1c0c8cb3-9b33-d9f6-32a0-59551683165c.png">
そしてコード画面に以下のソースを貼り付けてください。
ただしコード内の`YOUR_TABLE_NAME`を先程作ったテーブル名に書き換えましょう。

```javascript
'use strict';
const AWS = require("aws-sdk");
const db = new AWS.DynamoDB.DocumentClient({region:"us-east-1"});
exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;
  const badResponse = {
    status: '401',
    statusDescription: 'Unauthorized',
    body: 'Unauthorized',
    headers: {
      'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
    }
  };
  if (typeof headers.authorization == 'undefined') {
    callback(null, badResponse);
  } else {
    let str = new Buffer(headers.authorization[0].value.split(" ")[1], 'base64');
    let message = str.toString().split(":");
    if(!Boolean(message[0]) || !Boolean(message[1]))
      callback(null, badResponse);
    let params = {
      TableName: YOUR_TABLE_NAME,
      Key: { user: message[0] }
    };
    db.get(params, (err, data) => {
      if(err) console.log(err);
      else {
        if(typeof data.Item == "undefined" || message[1] != data.Item.pass)
          callback(null, badResponse);
        else
          callback(null, request); 
      }
    });
  }
};
```
また、タイムアウトを５秒に変えておきましょう。
これで関数を保存し、アクションからLambda@Edgeへデプロイをしましょう。
CloudFrontディストリビューションは、CloudFrontの画面から確認し、同じものを選んでください。
イベントはビューアーリクエストで、最後にチェックをいれデプロイします。
<img width="821" alt="スクリーンショット 2018-11-15 15.38.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/0622b804-e46e-c1b7-b20b-f3af0494cf24.png">
うまく成功し、バージョン1が発行されれば成功です。
先程のURLにアクセスするとBasic認証がくるはずです。来ない場合は少し時間をおいてみましょう。
<img width="447" alt="スクリーンショット 2018-11-15 15.52.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/bbd16b3a-9db7-cb9b-dec4-788a6efa7b2e.png">


---
Lambda関数のログは、Lambda関数が存在するリージョンのCloudWatchログに記録されますが、Lambda@Edgeの場合、アクセスしてきたコンピュータの所在地に一番近いリージョンに記録されます。
日本から試す場合は、ap-northeast-1に保存されています。

---

##WorkMailを使わず、届いたメールを元々持っているメールアドレスに転送する、サーバーレスメール運用
流れとしては、SESのルールを設定し、そのドメインにメールが届くとS3に保存、さらにS3にデータが追加されることをトリガーとしてLambda関数が起動、Lambda関数が指定したアドレスへ、S3からデータを取得し、送信するというようになります。
まずSESのルールを設定します。
SESのRule Setsから、新しくルールを追加します。
Recipientsにドメインのみを選択すると、そのドメイン宛全てのメールが範囲になります。
今回は特定のアドレスにしぼりたいので@マーク以前も入力しています。
<img width="205" alt="スクリーンショット 2018-11-15 18.33.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/6d52b209-461b-4077-7ada-c15b6f92fae1.png">
ActionにS3を選択し、新しいバケットを作成、わかりやすいプレフィクスを設定して、暗号化の設定、今回は非暗号化でやります。
<img width="547" alt="スクリーンショット 2018-11-15 18.35.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/5177570f-b321-d353-40f6-d2e723bcfbce.png">
設定したら次へ、ルールセットは任意の名前を入れて、後はデフォルトのままで次へ、確認して作成
<img width="760" alt="スクリーンショット 2018-11-15 18.36.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/9af56245-2d7b-dffe-1ec1-279dd7bcf389.png">
S3から、先程作成したバケットを選択し、プレフィクスに入力した名前のフォルダを開くと、中にAMAZON_SES_SETUP_NOTIFICATIONという名前のファイルがあるはずなので確認。あれば成功。
<img width="627" alt="スクリーンショット 2018-11-15 18.38.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/d777353d-175f-63bb-fb6c-6677e15eb6fb.png">

次にLambda関数の作成
任意の名前で、Python3で、1つ以上の(ryを選びポリシーを何も選択せずに作成。
IAMから作成されたロールにSESとS3の全ての動作を許可するポリシーを選択
以下のコードは[こちら](http://tech.innovation.co.jp/2017/06/04/Route53-S-E-S-S3-Lambda-Gmail.html)のサイトにあるコードを少し修正したものです。

```python
import boto3
import email
import re

ORIGIN_TO  = #下で指定したアドレスに送信する、送信元のアドレスをここに指定
FORWARD_TO = #ここに指定したアドレスに転送
SES_REGION = "us-east-1"
S3_BUCKET  = #S3バケット名

def parse_mail(raw_message):

    from_name = 'No Name'

    pattern = re.compile(r'^From:\s*(.+?)$', re.MULTILINE)
    m = re.search(pattern, raw_message)
    if m:
        from_name = m.group(1)[:-1]
    replaced_message = raw_message.replace(ORIGIN_TO, FORWARD_TO)
    replaced_message = re.sub(r'^From:\s*.+?$', r'From: "%s" <%s>' % (from_name, ORIGIN_TO), replaced_message, flags=re.MULTILINE)
    replaced_message = re.sub(r'^Return-Path:\s*.+?$', r'Return-Path: "%s" <%s>' % (from_name, ORIGIN_TO), replaced_message, flags=re.MULTILINE)
    replaced_message = re.sub(r'^Sender:\s*.+?$', r'Sender: "%s" <%s>' % (from_name, ORIGIN_TO), replaced_message, flags=re.MULTILINE)
    return replaced_message

def send_mail(message):

    ses = boto3.client('ses', region_name=SES_REGION)
    ses.send_raw_email(
        Source = FORWARD_TO,
        Destinations=[
            FORWARD_TO
        ],
        RawMessage={
            'Data': message
        }
    )

def lambda_handler(event, context):
    try:
        s3_key = event['Records'][0]['s3']['object']['key']

        s3 = boto3.client('s3')
        response = s3.get_object(
            Bucket = S3_BUCKET,
            Key    = s3_key
        )
        raw_message = response['Body'].read().decode('utf-8')
        message = parse_mail(raw_message)

        send_mail(message)

    except Exception as e:
        print(e)
```
これでLambdaのトリガーに先程作成したS3バケットの名前を入力すると完成
**写真と説明が少ないのは、記事をある程度書き終え、使わないと思いhell0wannabe.workに関わる設定を全てAWS上から消去してしまったためです。この項目の事すっかり忘れてました・・・**