LoginSignup
1
0

【AWS】ECS on FargateでWebサイトを構築してみた

Posted at

はじめに

今まではEC2にApacheなどをインストールしてWebサイトを構築し運用してきましたが、この度ECS on FargateでWebサイトを運用していきたいよねという話がちらほら出てきたので、実際にFargateでWebサイトを構築した際の内容や躓いた点をまとめます。

まず、ECSについて私自身知っていることとして、

  • 仮想環境
  • EC2よりお手軽で簡単

くらいで本当にコンテナ初心者です。
そのため、この記事ではFargateを使ってWebサイトを構築することを目標としています。

参考にしたECSやコンテナについて書かれている記事や入門書

  • ECSやコンテナについて書かれている記事

  • ECSの設定について書かれている記事

  • ECSの入門書

構築イメージ図

image.png

クラスメソッド様の記事を参考に設計構築する際に考慮した方がよい箇所をまとめました。

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ポリシーをアタッチしアクセスキーを発行します。

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」という名前のファイルを新規作成します。

Dockerfile
FROM nginx:latest

COPY ./src /usr/share/nginx/html

3.「ecs_test」フォルダ配下に、「src」という名前のフォルダを新規作成します。

4.「src」フォルダ配下に、「index.html」という名前のファイルを新規作成します。

index.html
Hello world from ECS nginx!!!
今回作成したフォルダ構成はこちらになります
C:
├ Users
│ └ user
│   └ ecs_test
│     └ Dockerfile
│     └ src
│       └ index.html
︙

ECRレポジトリの作成

公開されている手順を参考に、レポジトリの作成を行います。

手順内容 スクリーンショット
Amazon ECR > 「Repositories」 > 「レポジトリを作成」 20231117_AWS_ECS_000001.jpg
次の箇所を入力し「レポジトリを作成」をクリックします。

・レジストリ名:hello-world-from-ecs
・タグのイミュータビリティ:有効
・KMS 暗号化:有効
20231117_AWS_ECS_000002.jpg
「プッシュコマンドを表示」をクリックします。 20231117_AWS_ECS_000003.jpg
表示された画面の手順に従いコマンドを実行します。
※画面内の手順2に関してはDockerfileがある場所でコマンドを実行します
20231117_AWS_ECS_000004.jpg
nginxイメージがプッシュされました。 20231117_AWS_ECS_000005.jpg

ALBの作成

こちらの記事を参考に、ALBの作成を行います。

ターゲットグループの作成

手順内容 スクリーンショット
EC2 > ターゲットグループ > 「ターゲットグループの作成」 20231117_AWS_ECS_000006.jpg
次の箇所を入力し「ターゲットグループを作成」をクリックします。

・ターゲットタイプの選択:IPアドレス
・ターゲットグループ名:ecs-targetgroup01
・プロトコル : ポート:HTTP
・VPC:任意のVPC
20231117_AWS_ECS_000007.jpg
20231117_AWS_ECS_000008.jpg
「ターゲットグループの作成」をクリックします。 20231117_AWS_ECS_000009.jpg
ターゲットグループが作成されました。 20231117_AWS_ECS_000010.jpg

ALBの作成

手順内容 スクリーンショット
EC2 > ロードバランサー > 「ロードバランサーの作成」 20231117_AWS_ECS_000011.jpg
Application Load Balancer > 「作成」 20231117_AWS_ECS_000012.jpg
次の箇所を入力し「ロードバランサーを作成」をクリックします。

・ロードバランサー名:ecs-elb-01
・スキーム:インターネット向け
・IPアドレスタイプ:IPv4
・VPC:任意のVPC
・マッピング:任意のパブリックサブネット
・セキュリティグループ:ALB用セキュリティグループ
20231117_AWS_ECS_000013.jpg
20231117_AWS_ECS_000014.jpg
20231117_AWS_ECS_000015.jpg.jpeg
ロードバランサーが作成されました。 20231117_AWS_ECS_000016.jpg

ECSの作成

クラスターの作成

手順内容 スクリーンショット
Amazon Elastic Container Service > クラスター > 「クラスターの作成」 20231117_AWS_ECS_000017.jpg
次の箇所を入力し「ターゲットグループを作成」をクリックします。

・クラスター名:ecs-hello-world-test-cluster
20231117_AWS_ECS_000018.jpg
クラスターが作成されました。 20231117_AWS_ECS_000019.jpg

タスク定義の作成

手順内容 スクリーンショット
Amazon Elastic Container Service > タスク定義 > 「新しいタスク定義の作成」 20231117_AWS_ECS_000020.jpg
次の箇所を入力し「作成」をクリックします。

・タスク定義ファミリー:hello-world-from-ecs-task-definition
・起動タイプ:AWS Fargate
・CPU:.25vCPU
・メモリ:.5 GB
・名前: hello-world-from-ecs-nginx
・イメージ URI:ECRにアップロードしたURL
・コンテナポート:80
・プロトコル:TCP
20231117_AWS_ECS_000021.jpg
20231117_AWS_ECS_000022.jpg
20231117_AWS_ECS_000023.jpg
タスク定義が作成されました。 20231117_AWS_ECS_000024.jpg

サービスの作成

手順内容 スクリーンショット
Amazon Elastic Container Service > クラスター > 作成したクラスター名 > サービス > 作成 20231117_AWS_ECS_000025.jpg 
次の箇所を入力し「サービスの作成」をクリックします。

・コンピューティングオプション:起動タイプ
・起動タイプ:FARGATE
・プラットフォームのバージョン:LATEST
・アプリケーションタイプ:サービス
・ファミリー:hello-world-from-ecs-task-definition
・サービス名:ecs-hello-world-test
・サービスタイプ:レプリカ
・必要なタスク:2
・VPC:作成したVPC
・サブネット:プライベートサブネット
・セキュリティグループ:ECS用セキュリティグループ
・パブリックIP:オフ
・ロードバランサーの種類:Application Load Balancer
・ロードバランサー:作成したALB
・ロードバランス用のコンテナの選択:hello-world-from-ecs-nginx 80:80
・リスナー:作成したリスナー
・ターゲットグループ:作成したターゲットグループ
20231117_AWS_ECS_000026.jpg
20231117_AWS_ECS_000027.jpg
20231117_AWS_ECS_000028.jpg
20231117_AWS_ECS_000029.jpg
サービスが作成されました。 20231117_AWS_ECS_000030.jpg

ECS作成時の注意事項
・ECSクラスターやサービスはCloudFormationにて作成されるので、誤ってClooudFormationのスタックを削除しないように注意します
・タスク定義で設定するCloudWatch設定について、該当のCloudWatchロググループを削除すると起動できないのでロググループがあることを確認します(サービス作成時にCloudWatchロググループが新規作成らしい)

動作確認

手順内容 スクリーンショット
EC2 > ロードバランサー > 作成したロードバランサー > DNS 名 20231117_AWS_ECS_000031.jpg
DNS名にアクセスできることを確認します。 20231117_AWS_ECS_000032.jpg

さいごに

無事にFargateを利用してWebサイトを構築することができました。
試験的にWebサイトを構築したことによって、コンテナへの理解に繋がりました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0