はじめに
今まではEC2にApacheなどをインストールしてWebサイトを構築し運用してきましたが、この度ECS on FargateでWebサイトを運用していきたいよねという話がちらほら出てきたので、実際にFargateでWebサイトを構築した際の内容や躓いた点をまとめます。
まず、ECSについて私自身知っていることとして、
- 仮想環境
- EC2よりお手軽で簡単
くらいで本当にコンテナ初心者です。
そのため、この記事ではFargateを使ってWebサイトを構築することを目標としています。
参考にしたECSやコンテナについて書かれている記事や入門書
- ECSやコンテナについて書かれている記事
- ECSの設定について書かれている記事
- ECSの入門書
構築イメージ図
クラスメソッド様の記事を参考に設計構築する際に考慮した方がよい箇所をまとめました。
ECS設計構築時の考慮点をざっとまとまています。
IAM部分
- アカウント分離/認証/権限管理
ネットワーク部分
- EC2などのインフラ構築と同様な部分とコンテナ特定の部分を意識して設計
- AWSのセキュリティ関連サービスで設定変更検知を実施しミスを防止
レジストリ部分
- ECRへアクセスできるユーザの権限を制限
- レジストリ内の古いイメージの削除
- イミュータブルなタグ名のみ許可
イメージ部分
- イメージスキャン(Inspector V2)を利用する
- CI/CDにイメージスキャンを組み込み、CD経由のみデプロイ
- Dockerfileの脆弱性をdockleやTrivyなどでチェック
- 機密情報はSecretManager/SSM ParameterStoreに保存
Container部分
- ルートファイルシステムを読み取り専用に変更
ECSのベストプラクティスは今後内容が更新される可能性がありますので、最新のベストプラクティスを参照して下さい。
構築するAWSサービス
- VPC
- サブネット(パブリック×2、プライベート×2)
- インターネットゲートウェイ
- NATゲートウェイ
- ルートテーブル(パブリック×1、プライベート×1)
- セキュリティグループ(ALB用、ECS用)
- ALB
- IAM(ポリシー、ユーザ)
- ECR
- ECS
今回、ネットワーク周りやセキュリティグループ、IAMの設定は下記の設定値で作成しています。
ご自身の環境に応じて、設定変更いただければと思います。
ネットワーク周り
AWSサービス | 設定値 |
---|---|
VPC | 192.168.0.0/20 |
パブリックサブネット1 | 192.168.1.0/24 |
パブリックサブネット2 | 192.168.2.0/24 |
プライベートサブネット1 | 192.168.3.0/24 |
プライベートサブネット2 | 192.168.4.0/24 |
パブリックルートテーブル
送信先 | ターゲット | 備考 |
---|---|---|
0.0.0.0/0 | igw-********** | インターネットゲートウェイを指定します |
プライベートルートテーブル
送信先 | ターゲット | 備考 |
---|---|---|
0.0.0.0/0 | nat-********** | NATゲートウェイを指定します |
ALB用セキュリティグループ
ルール | タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|---|
インバウンドルール① | HTTP | TCP | 80 | 0.0.0.0/0 |
ECS用セキュリティグループ
ルール | タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|---|
インバウンドルール① | HTTP | TCP | 80 | ALB用セキュリティグループ |
IAM
ECRにnginxイメージをプッシュできるようにするために様々な方法がありますが、今回はIAMユーザのアクセスキーを使用してイメージのプッシュを行います。
下記内容でのIAMポリシーの作成します。
その後、任意のIAMユーザを作成して、IAMポリシーをアタッチしアクセスキーを発行します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"ecr:CompleteLayerUpload",
"ecr:UploadLayerPart",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage"
],
"Resource": "arn:aws:ecr:ap-northeast-1:<AWSアカウントID>:repository/hello-world-from-ecs"
}
]
}
手順
今回のFargateを利用してのWebサイトの構築は、構成イメージが似ている記事を参考にして構築させていただきました。
構築するのにあたり、ネットワーク周りやセキュリティグループ作成、IAM作成の説明は省きます。
ECRにnginxイメージをプッシュ
手元のPCがWindows10なので、こちらの記事を参考に、nginxイメージをプッシュしていきます。
AWS CLIのインストール
AWS CLIがインストールされていない場合は、公開されているインストール手順を参考に、AWS CLIのインストールを行います。
※特に変更などせずデフォルトのままインストールを行っています。
※AWS CLIに任意の認証情報を設定してください。
Dockerのインストール
Dockerがインストールされていない場合は、公開されているインストール手順を参考に、Dockerのインストールを行います。
※特に変更などせずデフォルトのままインストールを行っています。
nginxイメージの作成
nginxイメージを作成します。
- Dockerfileの作成
1.任意の場所に「ecs_test」という名前のフォルダを新規作成します。
2.「ecs_test」フォルダ配下に、「Dockerfile」という名前のファイルを新規作成します。
FROM nginx:latest
COPY ./src /usr/share/nginx/html
3.「ecs_test」フォルダ配下に、「src」という名前のフォルダを新規作成します。
4.「src」フォルダ配下に、「index.html」という名前のファイルを新規作成します。
Hello world from ECS nginx!!!
今回作成したフォルダ構成はこちらになります
C:
├ Users
│ └ user
│ └ ecs_test
│ └ Dockerfile
│ └ src
│ └ index.html
︙
ECRレポジトリの作成
公開されている手順を参考に、レポジトリの作成を行います。
ALBの作成
こちらの記事を参考に、ALBの作成を行います。
ターゲットグループの作成
ALBの作成
ECSの作成
クラスターの作成
手順内容 | スクリーンショット |
---|---|
Amazon Elastic Container Service > クラスター > 「クラスターの作成」 | |
次の箇所を入力し「ターゲットグループを作成」をクリックします。 ・クラスター名:ecs-hello-world-test-cluster |
|
クラスターが作成されました。 |
タスク定義の作成
サービスの作成
ECS作成時の注意事項
・ECSクラスターやサービスはCloudFormationにて作成されるので、誤ってClooudFormationのスタックを削除しないように注意します
・タスク定義で設定するCloudWatch設定について、該当のCloudWatchロググループを削除すると起動できないのでロググループがあることを確認します(サービス作成時にCloudWatchロググループが新規作成らしい)
動作確認
手順内容 | スクリーンショット |
---|---|
EC2 > ロードバランサー > 作成したロードバランサー > DNS 名 | |
DNS名にアクセスできることを確認します。 |
さいごに
無事にFargateを利用してWebサイトを構築することができました。
試験的にWebサイトを構築したことによって、コンテナへの理解に繋がりました。