AWS構築[Cloudfront+ELB+WEB+DB+S3]
AWSなれるために2018年ごろに手でポチポチ構築したときのメモ なので今は設定画面とか変わっているものがありそう [Cloudfront+ELB+WEB+DB+S3] 構成。 ほとんどの場合、Terraformで構築すると思うけど、 その前のAWS入門として一応残しておきます。
仕様と構成
サブネット構成
名前タグ | VPC | AZ | IPv4 CIDR ブロック |
---|---|---|---|
subnet-hogehoge-training-ssh | hog | ap-northeast-b | 172.31.hoge.0/24 |
subnet-hogehoge-training-web01 | training | ap-northeast-b | 172.31.hoge.0/24 |
subnet-hogehoge-training-web02 | training | ap-northeast-c | 172.31.hoge.0/24 |
subnet-hogehoge-training-db01 | training | ap-northeast-b | 172.31.hoge.0/24 |
subnet-hogehoge-training-db02 | training | ap-northeast-c | 172.31.hoge.0/24 |
IAMロール
- IAMロール名
- hoge-training
- 権限
- EBSスナップショット
- S3ファイルアップロード権限
S3
サーバ構成
踏み台
- OS
- CentOS7(AWS Marketplaceから)
- インスタンス対応
- t2.micro
- サブネット
- subnet_ssh
- 自動割当パブリックIP
- 有効化
- プライベートIPアドレス
- 172.31.hoge.10
- ディスク
- 初期値を利用
- ボリュームタイプは汎用SSD(GP2)
- タグ
- セキュリティグループ
- キーペア
- 新規作成
- EIP
- 必要
- ホスト名
web
- OS
- CentOS7(AWS Marketplaceから)
- インスタンス対応
- t2.micro
- サブネット
- 自動割当パブリックIP
- 有効化
- プライベートIPアドレス
- ディスク
- 初期値を利用
- ボリュームタイプは汎用SSD(GP2)
- タグ
- セキュリティグループ
- キーペア
- 新規作成
- EIP
- 不要
- ホスト名
- ミドルウェア
ELB(ALB)
- 名前
- hoge-training-elb
- セキュリティグループ
- セキュリティグループ名:hoge-training-elb
- ルーティングの設定
- ターゲットグループ名:hoge-training-elb
- ターゲットの登録
- webサーバ2台を登録
RDS(MySQL)
- サブネットグループの作成
- hoge-training-db
- 開発/テストを洗濯
- DBエンジンのバージョン
- 最新版を選択
- DBインスタンスの選択
- db.t2.micro
- マルチAZ配置
- はい
- DBインスタンス識別子
- hoge-training-db
- マスターユーザの名前
- root
- パスワード
- VPC
- training
- サブネットグループ
- パブリックアクセス可能
- いいえ
- VPCセキュリティグループ
- タグ名: hoge-training-db
- インバウンドルールの編集: webサーバのsubnetからのみ3306のアクセス許可
- データベース名
- hoge_training_db
- バックアップウィンドウ
- 開始時間20:00UTF
- マイナーバージョン自動アップグレード
- いいえ
- メンテナンスウィンドウ
- 開始日時:日曜日の21:00UTF
CloudFront
S3参照
- logoの画像
/image/
配下は300秒キャッシュ(http://hoge-training.<ドメイン>/image/)
- logo以外
/js/
,/css/
配下は600秒キャッシュ(http://hoge-training.<ドメイン>/js/),(http://hoge-training.<ドメイン>/css/)
- それ以外はキャッシュさせない
- 他のパラメータ値は気にしない
Route53
hoge-trainigをサブドメインとして<ドメイン>に登録
流れ
- hoge-training.<ドメイン> にアクセスするとサイト表示閲覧可能にする。
- ELB から 2 台に振り分けられている状態
- index.html を設置
- RDS 作成
- web サーバから mysql コマンドで接続可能
- CloudFront の設定
- プログラムの作成
手順
IAMロールの作成
ロールは永続的な権限(アクセスキー、シークレットアクセスキー)を保持するユーザーとは異なり、 一時的にAWSリソースへアクセス権限を付与する場合に使用します。
- AWSリソースへの権限付与
- EC2上で稼働するアプリに一時的にAWSのリソースへアクセスする権限を与えたい場合
- EC2作成時にロールを付与することで可能
- [AWS]IAMロールをEC2インスタンスに設定(アタッチ)してみたで、既存のインスタンスにもアタッチ可能
- クロスアカウントアクセス
- 複数のAWSアカウント間のリソースを1つのIAMユーザアカウントで操作したい
- IDフェデレーション
- WEB IDフェデレーション
AWSコンソールのIAM→ロール→ロールの作成
EC2インスタンスだけがそのロールを取得することができるポリシーを選択
次のステップ:アクセス権限
をクリック
ポリシーの作成
をクリック
後述の IAMポリシーの付与
に飛びます。
IAMユーザとグループ
今回は使わないがロールではなくユーザとグループを作成してポリシーを付与するのは以下手順
AWSコンソールのIAM→ユーザ→ユーザを追加
IAMユーザにアクセス権限を設定する場合、ユーザーに直接ポリシー付与する方法と、ポリシー付与したグループを作成して、ユーザーをグループに所属させる方法がある。
基本的にはIAMグループに対して、アクセス権限を設定するようにする。
グループの名前も管理者であることが想像できるものにするのがよい。
- ユーザ名
- hoge-training
- AWSアクセスの種類を選択
- アクセスの種類:プログラムによるアクセス、AWSコンソールへのアクセス
- カスタムパスワード:*********
- パスワードのリセットが必要
- ユーザをグループに追加で
グループの作成
をクリック - グループ名
hoge-training
入力してグループの作成
をクリック - ポリシーの付与はのちほど行うので
次のステップ:確認
をクリック ユーザーの作成
をクリック
これでIAMユーザーが作成されました。
作成結果の画面にアクセスキーIDとシークレットアクセスキーが表示されていますので、
忘れずに控えておきましょう。
.csvのダウンロード
をクリックすると、アクセスキー情報が記載されたCSVファイルをダウンロードできます、
後からアクセスキーの作成は可能だが、同じアクセスキーは二度とダウンロードできないので注意。
アクセスキーを不特定多数が閲覧可能な場所には置かないこと。Githubとか...
アクセスキーを入手したら 閉じる
をクリックしてIAMのユーザー画面に戻る。
IAMポリシーの付与
作成したIAMユーザにアクセス権限を設定 アクセス権限はIAMポリシーで管理されます。 ポリシーには管理ポリシーとインラインポリシーの2種類があります。
- 管理ポリシー
- インラインポリシー
- 特定のIAMユーザ、IAMグループ、IAMロールに直接付与されるポリシー
- 基本的には管理ポリシーを使うので、インラインポリシーが付与されることはあまりない。
- 管理ポリシーはそのポリシーを適用している全ユーザ、グループ、ロールに影響があるので、特定のユーザのみに付与したい場合などはインラインポリシーを使う
ポリシーはJSON形式で記述します。
権限を以下のみにしたいので参考記事を参照しつつ設定してください。
- EBSスナップショット
- S3ファイルアップロード権限
参考記事
Review policy
をクリックし、ポリシー名と説明を記入し、 Create policy
をクリック
次にアクセス権限ポリシーをロールにアタッチさせます。
対象のポリシーを選択し、 次のステップ:確認
をクリック
ロール名とロールの説明を入力し、 ロールの作成
をクリック
EC2で対象のインスタンスを選択し、 アクション→インスタンスの設定→IAMロールの割り当て/置換
をクリックし,アタッチしたいポリシーを選択。
サブネットの作成
サブネットは大きなネットワークを複数の小さなネットワークに分割して管理する歳の、管理単位となるネットワーク ELBを作成する予定があるサブネットは余裕を持って、「/24」(256IPアドレス以上)のネットワーク範囲で作成することが推奨 なぜなら、ELB作成時でELBを作成するサブネットに20IPアドレス以上の空きが必要になるため、「/28」(16IPアドレス)で作成したサブネットにはELBを作成することができないため。
AWSコンソールで VPC→サブネット→サブネットの作成
から以下の条件でサブネットを作成する
名前タグ | VPC | AZ | IPv4 CIDR ブロック |
---|---|---|---|
subnet-hoge-training-ssh | training | ap-northeast-b | 172.31.hoge.0/24 |
subnet-hoge-training-web01 | training | ap-northeast-b | 172.31.hoge.0/24 |
subnet-hoge-training-web02 | training | ap-northeast-c | 172.31.hoge.0/24 |
subnet-hoge-training-db01 | training | ap-northeast-b | 172.31.hoge.0/24 |
subnet-hoge-training-db02 | training | ap-northeast-c | 172.31.hoge.0/24 |
踏み台とWEBは- 自動割当パブリックIPを有効化にしたいので、
サブネットのアクション
タブの自動割り当てIP設定の変更
から有効化します。
EC2作成
AWS操作用の公開鍵・秘密鍵の作成
EC2では公開鍵暗号方式でろログインをします。
EC2→キーペア→キーペアの作成
でキーペアを作成します。
作成したキーペアは作成したタイミングでしかダウンロードできないので注意。
- AWSコンソールからEC2を選択
- EC2ダッシュボードからキーペアを選択
- キーペアの作成をクリック
- キーペア名に作成するキーペアの名前を入力
- 作成をクリック
- pem形式のファイルをダウンロードします。
権限は600
にします。
$ chmod 600 hoge.pem
セキュリティグループを作成
セキュリティグループはホワイトリスト方式なので「何を許可するのか」のみ指定可能 また、セキュリティグループはVPCごとの設定になります。
AWSコンソールのEC2→セキュリティグループ→セキュリティグループの作成
からインバウンド(内部への通信)
で以下の条件で作成
- 踏み台
- WEB
- ELB
- DB
EC2作成・起動
AWSコンソールのEC2→インスタンス→インスタンスの作成
から作成していく
- AMIの選択
AWS Marketplace からCentOS7を選択
- インスタンスタイプの選択
t2.micro
- 詳細設定
ネットワークで対象のVPCを選択 サブネットはそれぞれのものを選択 自動割り当てパブリック IPは有効化 ネットワークインターフェイスのプライマリIPで以下のを指定 - ssh - 172.31.hoge.10 - web01 - 172.31.hoge.10 - web02 - 172.31.hoge.10
ストレージの追加
初期値を利用
ボリュームタイプは汎用SSD(GP2)
タグの追加
Name:hoge-training-ssh Name:hoge-training-web01 Name:hoge-training-web02
- セキュリティグループの設定
既存のセキュリティグループを選択
EIP
AWSコンソールのEC2→Elastic IP→新しいアドレスの割り当て
でElasticIPを作成
次にアクション→アドレスの関連付け
で踏み台のインスタンスとプライベートIPを選択を選択し関連付けをおす。
ELBの作成
AWSコンソールのEC2→ロードバランサー→ロードバランサーの作成
をクリック。
ALBのHTTP(S) で作成。
名前:hoge-training-elb リソースはHTTPのみ アベイラビリティーゾーン:VPCと登録するEC2インスタンスを含むAZを選択 タグ:Name,hoge-training-elb
次の手順:セキュリティ設定の構成
を選択
以下のエラーが出るが気にせず、進む。
ロードバランサーのセキュリティを向上させましょう。ロードバランサーは、いずれのセキュアリスナーも使用していません。 ロードバランサーへのトラフィックを保護する必要がある場合は、フロントエンド接続に HTTPS プロトコルをお使いください。 最初のステップに戻り、基本的な設定 セクションでセキュアなリスナーを追加 / 設定することができます。または現在の設定のまま続行することもできます。
ステップ 3: セキュリティグループの設定
では既存のセキュリティグループを選択する
で既に作成したセキュリティグループを選択
ステップ 4: ルーティングの設定
のターゲットグループ
では名前だけ入力
名前:ELBTARGET
ステップ 5: ターゲットの登録
で追加したいEC2インスタンスを選択して、登録済みに追加
をクリック
登録済みに追加
されたら次の手順:確認
を選択
ステップ 6: 確認
で問題なければ作成
ELBの動作確認
webサーバにcentosをインストール
# yum -y install httpd # systemctl list-unit-files -t service |grep httpd httpd.service disabled # systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service. # systemctl list-unit-files -t service |grep httpd httpd.service enabled # systemctl start httpd.service
ELBのDNS名をブラウザに入力してindex.html
の中身が表示されることを確認
ターゲットグループのターゲットから両インスタンスがhealthy
になることを確認
Route53の設定
ホストゾーンドメイン
は既にあるものなどを使い、
hoge-trainigをサブドメインとして ドメイン
に登録する。
ホストゾーンはそのドメインのリソースレコードセットの集合です。
Route53→Hosted zones
からドメイン
を選択
Create Record Set
を選択
Name:hoge-training
Type:Aレコード(IPv4)
Value:Alias:Yes
Alias Target:ELBのDNS名
Routing Policy:Simple
のちにAliasをCloudFrontに変更します。
RDS 作成
VPC上にRDSインスタンスを起動する場合、DBサブネットグループを作成する必要があるので まずはサブネットグループを作成します。
RDS→サブネットグループ→DBサブネットグループの作成
を選択
サブネットグループの詳細
名前:hoge-training
説明:middle engineer training ozawa subnet
VPC:trainingのVPCを選択
サブネットの追加でアベイラビリティーゾーン
とサブネット
RDS→インスタンス→DBインスタンスの起動→MySQL
を選択
DB詳細の指定
- 開発/テストを選択
- DBエンジンのバージョン
- 最新のバージョン
- DBインスタンスの選択
- db.t2.micro
- マルチAZ配置
- 別のゾーンにレプリカを作成します
- DBインスタンス識別子
- hoge-training-db
- マスターユーザの名前
- root
- パスワード
[詳細設定]の設定 ネットワーク&セキュリティ
- VPC
- training
- サブネットグループ
- hoge_training
- パブリックアクセシビリティ
- いいえ
- アベイラビリティーゾーン
- 指定なし
- VPCセキュリティグループ
- タグ名: hoge-training-db
データベースの設定
- データベースの名前
- hoge_training_db
- データベースのポート
- 3306
- DBパラメータグループ
- デフォルト
- オプショングループ
- デフォルト
- IAM DB 認証
- 無効化
暗号化
- 無効化(無料利用枠ではデフォルトで無効)
バックアップ
- バックアップの保存期間
- 1日
- バックアップウィンドウ
- 開始時間20:00UTF期間0.5時間
- タグをスナップショットへコピー - チェック
モニタリング
- 拡張モニタリング
- 有効
- モニタリングロール:デフォルト
- 60秒
ログのエクスポート
- 監査ログ
- 有効
- エラーログ
- 無効
- 全般ログ
- 有効
- スロークエリログ
- 有効
メンテナンス
- マイナーバージョン自動アップグレード
- 無効化
- メンテナンスウィンドウ
- 開始日時:日曜日の21:00UTF期間0.5時間
DBインスタンスの作成
で作成完了
webサーバにmysqlクライアントをインスタンス RDSインスタンスからエンドポイントを確認
# yum install mysql -y # mysql -u root -h エンドポイント名 -p
S3
hoge-training.<ドメイン>
でバケットを作成します。
S3→バケットを作成する
で作成します。
{ "Version": "2012-10-17", "Id": "PublicRead", "Statement": [ { "Sid": "ReadAccess", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::hoge-training.<ドメイン/*" } ] }
プロパティの設定およびアクセス許可の設定はデフォルトのまま進めます。
CloudFrontの設定
CloudFrontはAWSのCDNサービスです。 CDNとはコンテンツを配信するために最適化されたネットワークのことです。 分散して配置されたサーバからコンテンツを配布することで効率的にコンテンツを配信する仕組み。
CloudFrontはAWSが世界中に配置したエッジサーバを利用して効率的にコンテンツを配信します。 エッジサーバはCloudFrontのコンテンツの配布ポイントでユーザーのアクセスを最も近くにあるエッジサーバに誘導します。 「xxx.cloudfront.net」というドメインにアクセスすると、最も近いエッジサーバのIPアドレスが返されます。 CloudFrontではコンテンツの配信元のサーバをオリジンサーバと呼びます。 CloudFrontを利用していない場合は、全てのアクセスがオリジンサーバにいくが、 利用するとオリジンサーバに到達する前に、エッジサーバがコンテンツを返す。 そのため、オリジンサーバの負荷を下げることができ負荷分散としても大きな意味があります。 なのでEC2やS3等コンテンツを配信するサーバの前には、なるべくCloudFrontを配置するべき。
エッジロケーションはエッジサーバが存在する地域で、日本では東京と大阪にある。
CloudFront→Create Distribution
をクリック
- コンテンツの配信方法の選択
HTTP[S]で表示するWEBコンテンツの配信なのでWEBを選択します。
- Distributionの設定
OriginSettingでオリジンサーバの設定をします。
今回CloudFrontはS3とALBの前に設置するので、
Origin Domain Name
にS3とALBを選択して入力することになります。
- Origin Domain Name
- Behaviors
- /image/* 300 秒キャッシュ
- Origin Domain Name
- hoge-training-elb-1353485913.ap-northeast-1.elb.amazonaws.com
Behaviors
- /js/* 600 秒キャッシュ
- /css/* 600 秒キャッシュ
- Default (*)
Distributionの設定(Origin Settings)
オリジンサーバの設定をする
設定項目 | 値 | 説明 |
---|---|---|
Origin Domain Name | S3バケットのエンドポイント | オリジンサーバのドメインを入力 |
Origin Path | 値なし | CloudFrontへのリクエストをオリジンサーバの特定のパスにルーティングしたい場合に設定。 |
Origin ID | 任意の名前 | このDistributionを区別するための名前を設定 |
Restrict Bucket Access | No | オリジンがS3の場合のみ有効。S3バケットのコンテンるへのアクセスをCloudFrontからのみに制限する場合はYes。直接エンドポイントにアクセスできるようにするならNo |
Origin Custom Headers | 値なし | リクエストをオリジンサーバに転送する際のヘッダーを指定 |
- Default Cache Behavior Setting
キャッシュの動作の設定をする
設定項目 | 値 | 説明 |
---|---|---|
Path Pattern | Default(*) | キャッシュを有効にするパスのパターンを指定。 |
Viewer Priticol Policy | HTTP and HTTPS | コンテンツにアクセスする際にどのプロトコルを使用するか選択 |
Allowed HTTP Methods | GET,HEAD | エンドユーザーに許可するHTTPメソッドを選択 |
Field-level Encryption Config | 値なし | 特定のデータフィールドにフィードレベル暗号化を適用する場合に指定 |
Cached HTTP Methods | GET,HEAD | CloudFrontでのキャッシュが有効になるHTTPメソッドを選択 |
Cached Based on Selected Request Headers | None | CloudFrontがオリジンサーバに転送するリクエストヘッダーの指定とヘッダー値に基づいてオブジェクトをキャッシュするかの設定を行う。 |
Object Caching | Use Origin Cache Headers | CloudFrontがキャッシュを保持する時間の設定。オリジンサーバで追加したCache-COntorolの時間に応じてキャッシュを保持する場合は、今回の値を設定する。 |
Minimum TTL | 0 | キャッシュの最小保持期間 |
Maximum TTL | 31536000 | キャッシュの最大保持期間 |
Default TTL | 86400 | キャッシュのデフォルトの保持期間 |
Foward Cookied | None | CloudFrontからオリジンサーバに転送するCookieを指定。オリジンがS3のときは無効。 |
Query String Fowarding and Caching | None | クエリ文字列に基づいてキャッシュを行う |
Smooth Streaming | No | Microsoftスムーズストリーミング形式のメディアファイルを配信する場合はYES |
Restrict Viewer Access | No | 署名付きURLを利用するかの選択 |
Compress Objects Automatically | No | ファイルを自動的に圧縮する |
Lambda Function Assopciations | 値なし | トリガーを追加するLambda関数のARNを指定 |
- Distribution Setting
Distributionの詳細を設定
設定項目 | 値 | 説明 |
---|---|---|
Price Class | Use ALL Edge Locations | 価格クラスを選択。 |
AWS WAF Web ACL | None | AWS WAFを使用する場合にウェブACLを選択する・ |
Alternate Domain Names | 値なし | 独自ドメインを利用する場合に設定 |
SSL Certificate | Default CloudFrint Cerificate | DefaultではCloudFrontにデフォルトで用意されている証明書を利用する。 |
Supported HTTP Versions | HTTP/2,HTTP/1.1,HTTP/1.0 | CloudFrontとの通信に使用するHTTPバージョンを指定 |
Default Root Object | index.html | デフォルトのルートオブジェクトを設定 |
Logging | OFF | ログを取得するか設定 |
Bucket for Logs | 値なし | ログを配置するS3のバケットを選択 |
Log Prefix | 値なし | ログファイル名の戦闘につける文字列を指定 |
Cookie Logging | off | ログにCookieも記録するか選択 |
Enable IPv6 | 有効 | IPv6を有効にするか選択 |
Comment | 値なし | 入力は任意。 |
Distribution State | Enabled | Distributionの使用準備が整ったあと、自動的にこのDistributionを有効にするか選択 |
Deployedになったら、Domain Nameに表示されている「****.cloudfront.net」にアクセスすればS3のコンテンツが表示されます。
- Route53との連系
Route53にCLoudFrontのエンドポイントを設定することで、独自ドメインでCloudFrontを利用することができます。 作成したDistributionを選択し、Distribution Settingをクリック。 GeneralタブのEditで編集画面に行き、Alternate Domain Namesに設定したい独自ドメインを入力する。
次にRoute5→Hotsted Zonesから使用する独自ドメインのホストゾーンを選択し、Aliasレコードを追加する。
確認項目
セキュリティ
RDS
- 手動フェイルオーバを行なう
- AZ が切り替わっていることを確認
- サービスが閲覧できることを確認
S3
- web サーバから aws コマンドを利用してS3 のバケットにテストファイルをアップロードする
- S3 のバケットから aws コマンドを利用してテストファイルをダウンロードする
- 踏み台からは S3 操作が不可であることを確認する
EBS
- web サーバから aws コマンドを利用して、EBS スナップショットを取得する
- 踏み台からは EBS スナップショット取得が出来ないことを確認
サイト表示
- yourname-training.<ドメイン> 画面表示が正常であることを確認
- web01, web02 に分散されていることを確認
- web01 を ELB から切り離しても正常に閲覧できることを確認
- image 配下へのアクセス
- S3 へアクセスが行っていることを確認
- js, css 配下へのアクセス ELB を経由していることを確認
- キャッシュ時間に応じてキャッシュされていることを確認
上記以外
- ELB を経由していることを確認
- キャッシュされていないことを確認