はじめに
概要
本記事では、 AWS コンポーネント・アーキテクチャを用いて以下の構成で Web アプリケーションを構築する手順を記載しています。
基本的な AWS サービス
- CloudFront
- ユーザーへの静的および動的なウェブコンテンツ (.html、.css、.js、イメージファイルなど) の配信を高速化するサービス。フロントエンドに使用。
- S3
- オブジェクトストレージサービス
- ALB
- Web サービスにおける負荷を分散させるロードバランシングサービス。バックエンドに使用。
- ECS ( Fargate )
- フルマネージドコンテナオーケストレーションサービス。コンテナ化されたアプリケーションを簡単にデプロイ、管理、およびスケーリングできる。
- RDS
- クラウド内でリレーショナルデータベースのセットアップ、運用、およびスケーリングを簡単に行うことのできるマネージド型サービス
補足的なサービス
- AWS WAF
- Amazon CloudFront、Application Load Balancer (ALB) 上で動作する AWS の提供するクラウド型 WAF のサービス。アクセス制限をかけることができる。
- Route53
- 可用性が高くスケーラブルなドメインネームシステム (DNS) ウェブサービス。ドメイン名を独自のものにする ( HTTPS 通信を可能にする ) 際に使用。
- ACM
- ウェブサイトやアプリケーションを保護するパブリックおよびプライベート SSL/TLS X. 509 証明書およびキーの作成、保存を行うことができる。 Web サイトを独自ドメインにする際の証明書の発行に使用。
目的
対象者
- AWS をこれから触り始めようとする方
- AWS を触り始めてサービス単体は理解しつつあるが、Web システム開発する際、どういう構成がいいか・どう構築していけばいいか分からない方
以上の対象者が、AWS サービスを用いて Web システムを実際に構築できるようになることを目的としています。
S3 と CloudFront
まず初めに、ユーザーが CloudFront を介して S3 内の情報をアクセスできるようにします。
S3 にバケットを作成
Amazon S3 からバケット、「バケットを作成」を選んで任意のバケット名と AWS リージョンを選択します。今回の構成ではリージョンを「アジアパシフィック(東京) ap-northeast-1 」、その他の設定はデフォルトで作成します。
作成したバケットを選択し、プロパティタブから静的ウェブサイトホスティングを編集し、以下の画像のように設定して保存します。
また、アクセス許可タブからパブリックアクセスのブロック(バケット設定)を編集し、すべてチェックが外れた状態に設定して保存します。
同じように、アクセス許可タブからバケットポリシーを編集し、ポリシーに以下のコードを設定して保存します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::Bucket-Name/*"]
}
]
}
作成したバケットにフロントエンドをアップロード
バケットのオブジェクトタブからアップロードを選択し、ビルドして作成されたフロントエンドの実行ファイルをアップロードします。
S3 から Web サイトを確認
バケットのプロパティタブにある静的ウェブサイトホスティング内の、バケットウェブサイトエンドポイントの URL から S3 にアップロードしたフロントエンドコードが確認できます。
CloudFront にディストリビューションを作成
AWS CloudFront からディストリビューションの作成を選択します。オリジンドメインには、作成した S3 のバケットウェブサイトエンドポイントの URL を指定し、その他の設定はデフォルトで作成します。 CloudFront からは、一般タブのディストリビューションドメイン名から S3 内のフロントエンドコードが確認できます。
補足 : アクセス制限をかける
S3 を CloudFront からのみアクセスできるようにする
作成したオリジンを編集します。カスタムヘッダーの追加を選択し、ヘッダー名は Referer 、値には任意の文字列を指定して変更を保存します。
S3 のバケットポリシーを以下のように変更して保存します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": ["arn:aws:s3:::Bucket-Name/*"]
"Condition": {
"StringLike": {
"aws:Referer": "任意の値"
}
}
}
]
}
CloudFront を任意の IP アドレスからのみアクセスできるようにする
AWS WAF を作成する
-
AWS マネジメントコンソールから WAF & Shield を選択し、「 Create web ACL 」を選択します。
-
Web ACL detailsの設定を行います。
-
Associated AWS resources の設定を行います。
- 「Add AWS resources」を選択
- Name にした CloudFront のディストリビューション名を選択
-
Add rules and rule groups の設定を行います。
その他の設定はデフォルトで作成します。
IP Set を作成する
-
左メニューのIP setsを選択します。
-
IP set details の設定を行います。
ACL にルールを作成
- WebACLs を選択、 Rules タブを選択します。
- 「 Add rules 」の「 Add my own rules and rule groups 」を選択します。
- Rule の設定を行います。
- Rule type に「 Rule builder 」を選択
- Rule Name に Rule 名を指定
- Type に「 Regular rule 」を選択
- If a request に「 matches the statement 」を選択
- Statement を設定する。
- Inspect に「 Original from an IP address in 」、 IP set に先ほど作成した IP set を選択
- IP address to use as the originating address に「 Source IP address 」を選択
VPC と ALB 、 Fargate
Amazon ECR にプライベートリポジトリを作成
Docker イメージを ECR にアップロード
※DockerイメージはWindows上で作成ツールを使用すると料金がかかるため、 WSL ( Ubuntu ) 上で作成
- Dockerイメージを作成したいファイルの直下にDockerfileを作成します。( 以下サンプル )
- 作成したリポジトリから、プッシュコマンドを表示を選択します。
- プッシュコマンドを順番に実行します。
※ AWS cli を最新にする必要があります。( 公式ドキュメント : https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html )
※ aws configureの情報がないとエラーがでるので、アクセスキーとシークレットアクセスキーを取得する必要があります。- 公式ドキュメント( https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html ) を参考に、 Access key ID とSecret access key の書かれている csv ファイルをダウンロード
- AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開く
- ナビゲーションペインで 「 Users 」 (ユーザー) を選択
- アクセスキーを作成するユーザー名を選択し、「 Security credentials (セキュリティ認証情報) 」 タブを選択
- 「 Access keys (アクセスキー) 」 セクションで、「 Create access key (アクセスキーを作成) 」 を選択
- 「 Download .csv file.csv 」 (キーファイルのダウンロード) を選択してキーペアをダウンロード
※このダイアログボックスを閉じた後で、シークレットアクセスキーに再度アクセスすることはできません。
VPC を作成
パブリックサブネットを作成
- VPC からサブネットを選択し、「サブネットを作成」を選択します。
インターネットゲートウェイを作成
ALB を作成
セキュリティグループを作成
ALB を作成
- EC2 からロードバランサーを選択し、「 Create load balancer 」を選択します。
ECS ( Fargate ) を作成
タスク定義を作成
- ECS からタスク定義を選択し、「新しいタスク定義の作成」を選択します。
クラスターを作成
ターゲットグループを作成
サービスを作成
- ECS からクラスター、作成したクラスターを選択し、サービスタブで「作成」を選択します。
ALB から接続確認
EC2 からロードバランサーを選択し、作成したロードバランサーの DNS 名でコンテナに接続できます。
補足 : HTTPS 通信ができるようにする
- AWS ACM で証明書を発行します。
※無料のパブリック証明書をリクエストし、完全修飾ドメイン名は AWS Route53 で後につくるレコード名と一致させる必要があります。各 AWS サービスごとに1つ作成してください。また、 CloudFront に証明書を紐づける際はリージョンを「バージニア北部」にする必要があります。
CloudFront の場合
-
作成したディストリビューションから、設定を編集します。
-
AWS Route53 で先ほど作成されたレコードを選択して編集します。
- レコード名を完全修飾ドメイン名と合わせる
- レコードタイプを A-IPv4 に変更
- エイリアスにチェックを入れて、トラフィックのルーティング先に「 Cloudfront ディストリビューションのエイリアス」を選択
- ディストリビューションに自分たちが作成した CloudFront のディストリビューション名を選択
ALB の場合
- HTTPS をインバウンドルールに入れたセキュリティグループを作成します。
- 作成したセキュリティグループを ALB に紐づけます。
- 作成した ALB を選択し、Listener タブから Add Listener を選択します。
- Protocol:Port に HTTPS:443 を選択したリスナーを追加します。
- AWS Route53 にレコードを作成します。
補足 : ALB と Fargate へのアクセス制限
ALB にIPアドレス制限をかける
- ALB で作成したリスナーを選択し、 Rules タブから Manage rules を選択して追加します。
Fargate を ALB からしかアクセスできないようにする
RDS を作成
プライベートサブネット作成
ルートテーブルを作成
プライベートサブネットを作成
- パブリックサブネットと同じ数作成します。 ( 今回は2つ )
- 作成したルートテーブルを紐づける
セキュリティグループを作成
EC2 のセキュリティグループを作成
- VPC は作成したものを選択します。
‐ インバウンドルールは SSH とすべての ICMP IPv4 を選択します。
RDS のセキュリティグループを作成
- VPC は作成したものを選択します。
- インバウンドルールは MySQL TCP/3306 を選択します。
DB サブネットグループの作成
- Amazon RDS のサブネットグループを作成します。( DB サブネットグループ)
EC2 ( RDS にアクセスするための踏み台)を作成
- インスタンスを起動します。
- OS イメージは AmazonLinax2 を選択します。
- キーペアを作成します。
- サブネットはパブリックサブネットを指定します。
- VPC とセキュリティグループは作成したものを使用します。
- パブリック IP の自動割り当ては有効化します。
RDS を作成
- MySQL を選択します。
- 可用性と耐久性は単一の DB インスタンスを選択
- パスワードは任意のものを入力します。
- インスタンスの設定では、任意の大きさを選択します。( DB 容量によってかかる料金が変わります。)
- VPC とサブネットグループは作成したものを選択します。
- パブリックアクセスはなしを選択します。
- 追加設定を開き、データベース名を入力しておきます。