【学習記録】S3でVueアプリケーションを公開して、Route 53+CloudFront+ACMでHTTPS接続を設定

先日バックエンドのHTTP化を勉強したので、フロントエンドも改めて設定しました。
フロントエンドのHTTPS化は以前も一度行なってはいたのですが、まだ深くは理解できていなかったので繰り返し勉強してちょっとずつ理解を深めたいと思います。
こちらの動画を参考にしました。

www.youtube.com

以下作業内容を箇条書きでまとめます。

ドメイン取得

今回はお名前ドットコムで「pictures-app.work」というドメインを取得しました。

S3でVueアプリケーション公開

自分が取得したドメイン名と同じ名前(pictures-app.work)でS3バケットを作成 f:id:JunpeiNakasone:20210208211708p:plain

S3バケットを公開するためにBlock all public accessのチェックマークを外しsave changesをクリック f:id:JunpeiNakasone:20210208211903p:plain

Edit Bucket Policyでポリシーをアクセス可能に変更 f:id:JunpeiNakasone:20210208212016p:plain

公開用のポリシーは以下の内容になる

{
   "Version":"2012-10-17",
   "Statement":[{
    "Sid":"PublicReadForGetBucketObjects",
         "Effect":"Allow",
      "Principal": "*",
       "Action":["s3:GetObject"],
       "Resource":["arn:aws:s3:::自分のS3バケット名/*"
       ]
     }
   ]
 }

S3のマネジメントコンソールのプロパティタブからStatic website hostingの設定を行う

Static website hostingをEnableにし、Index documentとError documentをindex.htmlに設定
f:id:JunpeiNakasone:20210208212448p:plain

S3のマネジメントコンソールでPublicly accessibleが表示されていることを確認(Publicly accessibleがなかったら設定忘れてるところないか確認する)

f:id:JunpeiNakasone:20210208212646p:plain

プロパティの画面にBucket website endpointが表示されていて、アクセスするとアプリケーションにアクセスできる f:id:JunpeiNakasone:20210208212933p:plain

Route 53で自分が取得したドメイン名と同じ名前でHosted Zoneを作成
f:id:JunpeiNakasone:20210208213443p:plain

Route 53でホストゾーンが作成されネームサーバーも登録されている
f:id:JunpeiNakasone:20210208213849p:plain

Route 53以外でドメインを取得している場合はRoute 53のネームサーバーとドメインを紐づけるよう設定する f:id:JunpeiNakasone:20210208213950p:plain

ネームサーバーの設定はターミナルからdig ドメイン名 NS +shortで確認できる(ネームサーバーの変更を行なった直後なのでまだお名前ドットコムのネームサーバーと紐づいているっぽい) f:id:JunpeiNakasone:20210208214341p:plain

少し時間が経つとAWSのネームサーバーに変わっていました f:id:JunpeiNakasone:20210208215200p:plain

次にRoute 53にAレコードを追加して、S3のバケットを指定するためIPアドレスではなくAliasでS3バケットを選択する(ドメイン名と同じバケット名のものしか選べないっぽい。なのでS3バケット名はドメイン名と同じにする必要があるかと) f:id:JunpeiNakasone:20210208215434p:plain

上記設定でRecord setを作成し、しばらくすると自分のドメインでサイトにアクセスできる f:id:JunpeiNakasone:20210208215553p:plain

Certificate Managerの設定

※後から気づいたのですが、CloudFrontでACMの証明書を選択するにはus-east-1(バージニア北部)リージョンで証明書を作成する必要がありました。

Certificate ManagerのマネジメントコンソールからRequest Certificateをクリック f:id:JunpeiNakasone:20210208215911p:plain

Step 1: Add domain namesの画面で自分のドメインを入力しNextをクリック f:id:JunpeiNakasone:20210208220119p:plain

Step 2: Select Validation MethodでDNS Validationを選択しNextをクリック
f:id:JunpeiNakasone:20210208220224p:plain

Step 3: Add tagsは任意で入力しStep 4: Reviewの画面で設定に問題ないことを確認する f:id:JunpeiNakasone:20210208220351p:plain

Step 5: Validationの画面でCreate record in Route 53をクリック f:id:JunpeiNakasone:20210208220550p:plain

Validationが成功することを確認 f:id:JunpeiNakasone:20210208220658p:plain

しばらくするとCertificatesの画面でもIssuedになっていて、CNAMEが発行されている f:id:JunpeiNakasone:20210208220840p:plain

CNAMEのドメインの前についている文字列をコピーする f:id:JunpeiNakasone:20210208221005p:plain

Route 53でCNAMEがRecord setに自動で追加されている f:id:JunpeiNakasone:20210208221609p:plain

CloudFrontの設定

CloudFrontの画面でCreate Distributionをクリック f:id:JunpeiNakasone:20210208222213p:plain

Step 1: Select delivery methodはwebを選択する f:id:JunpeiNakasone:20210208222418p:plain

Step 2: Create distributionのOrigin Domain NameでS3バケットなど選択候補に出るが、ここをクリックしてはいけないようで f:id:JunpeiNakasone:20210208222552p:plain

S3のマネジメントコンソールからStatic website hostingのエンドポイントのhttp://以下をコピーして f:id:JunpeiNakasone:20210208222740p:plain

そのままCloudFrontのOrigin Domain Nameに貼り付ける(ここらへんの仕組みはよくわかっていないので後から詳しく調べたい) f:id:JunpeiNakasone:20210208222910p:plain

CloudFrontでは上記のOrigin Domain Nameの他にViewer Protocol PolicyとAlternate Domain Names(CNAMEs)とSSL Certificateの設定を変更する(それ以外はとりあえずデフォルトでOK)

Default Cache Behavior SettingsのViewer Protocol PolicyをRedirect HTTP to HTTPSに設定
f:id:JunpeiNakasone:20210208223326p:plain

Distribution SettingのAlternate Domain Names(CNAMEs)に自分のドメインを入力する
f:id:JunpeiNakasone:20210208223555p:plain

SSL CertificateでCustom SSL Certificateから自分のドメインを選択する(us-east-1以外のリージョンでCertificate Managerの証明書を作成した場合はここでドメインが選択できないので注意)

aws.amazon.com

f:id:JunpeiNakasone:20210208225544p:plain

上記の設定完了後Create Distributionをクリックして、CloudFrontのステータスがIn Progressになっていることを確認する
f:id:JunpeiNakasone:20210208225734p:plain

CloudFrontのステータスがDeployedになったらCloudFrontのDomain NameでブラウザにアクセスしHTTPS通信できていることを確認する

f:id:JunpeiNakasone:20210208231352p:plain f:id:JunpeiNakasone:20210208231442p:plain

Route 53でAレコードのAiiasに先ほど作成したCloudFrontディストリビューションを設定する
f:id:JunpeiNakasone:20210208231724p:plain

自分のドメインにブラウザからHTTPSで接続しレスポンスが返ってくることを確認する
f:id:JunpeiNakasone:20210208231858p:plain