Zenn
🔰

AWS初心者向け~ゼロからECSアプリケーションの構築まで~ ECS 前編

2025/03/19に公開

5. ECS編

目次
  1. ECSとは。まずコンテナ開発について
  2. ECRでのリポジトリ作成とDocker Imageのpush
  3. Cloudformationを利用したECSクラスター、サービス、タスク定義の作成
  4. ECSクラスター、サービス、タスクについての説明
  5. HTTPS接続のためのopenssl証明書の作成とアップロード
  6. Application Load Balancerの作成とセキュリティグループ、ターゲットグループの作成

本講座で利用するDockerfileと関連するファイル、Cloudformationテンプレートファイルは、
こちらのGithubリポジトリに配置してます。
https://github.com/wat1881mayer/ecs-app-1

1. Dockerとは?、またその利点

まずコンテナ技術に関して

比較されるものとしてVagrantがサーバー側(ホスト)仮想化です。
比較図は、こちら

メリット

  1. アプリケーションの依存関係をコンテナ内で完結できる。...例えばローカルPCにインストールしたNode.jsのバージョンが違うからアプリの挙動が若干違うなどなどの問題を解決できます。Dockerfileで細かく記述された環境を誰でも再現できるためです。
  2. ローカルから別環境(開発環境、ステージング環境、本番環境)での構築・テストが効率化されます。(環境が同じなので)
    以下がDockerのコンテナワークフローです。

Docker Desktopまたは Rancher Desktopのインストール

Docker DesktopまたはRancher Desktopをインストールして、DockerデーモンをローカルPC
に動かせるようにしましょう。
ついでにDocker Desktopは今までは商用利用が無料でしたが、現在では商用利用は有料です。
そのため商用利用でも無料なRancher Desktopを代替品として使ってます。

AWS CLIを使用可能な状態にする。

ここではIAMユーザーのアクセスキーを作成して、AWS CLIのプロファイルとして構成します。

  1. AWS IAMのユーザーでアクセスキーを作成する。
  2. 作成したアクセスキーとシークレットキーは厳密に保管する。
  3. aws configureでprofile名を設定してaws cliがAWSリソースにアクセス可能な状態にする。
     aws configure --profile profile-name
    
    ここでCSVファイルでダウンロードした、Access Key IdとSecret Keyを画面の指示に従い入力する。
  4. これでセットアップ完了。以下コマンドで作成されたprofile情報が反映されているか確認する。
     aws configure list --profile profile-name
    

2. ECRでのリポジトリ作成とDocker Imageのpush

1. ECRにリポジトリを作成する。

  1. まずECRにてプライベートリポジトリを作成します。

  2. ローカルでECSアプリ本体となるDockerfileのあるパスをカレントディレクトリとする。

  3. Docker デーモンが起動している状態で以下コマンドを実行する。

     docker build  . -t  <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-app:latest
    
  4. dockerイメージができたら追加でタグを設定する。(ここでは、1.0と設定)

 docker tag ecs-app:latest <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-app:latest
 <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-app:1.0  
  1. ECRへのログイン情報を取得し、Dockerにログインする
aws ecr get-login-password --region region | docker login --username AWS --password-stdin  aws_account_id.dkr.ecr.region.amazonaws.com
  1. ECRにdockerイメージをpushする。
     docker push <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-learning:latest
       docker push <your-account-id>.dkr.ecr.<region>.amazonaws.com/ecs-learning:1.0
    

3. Cloudformationを利用したECSクラスター、サービス、タスク定義の作成

  1. ECSタスク実行用IAMロール「ECS-Learning-TaskExecutionRole」を作成する。ポリシーには「AmazonECSTaskExecutionRolePolicy」、「CloudwatchLogsFullAccess」をアタッチする。

  2. クラスター、タスク定義、サービスを記載したCloudformationテンプレートを用意する。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  ECSCluster:
    Type: 'AWS::ECS::Cluster'
    Properties:
      ClusterName:  MyEcsCluster
  ECSTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: my-ecs-task
      NetworkMode: awsvpc
      ContainerDefinitions:
        - Name: my-ecs-learning-container
          Image: <your-account-id>.dkr.ecr.us-east-1.amazonaws.com/<your-repo-name>/<your-image-name>:latest
          Essential: true
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: /ecs/fargate-task-definition
              awslogs-region: us-east-1
              awslogs-stream-prefix: ecs
              mode: non-blocking
              awslogs-create-group: "true"
              max-buffer-size: 25m
          PortMappings:
            - ContainerPort: 80
              HostPort: 80
              Protocol: tcp
            - ContainerPort: 443
              HostPort: 443
              Protocol: tcp

      Memory: 512
      Cpu: 256
      ExecutionRoleArn: <your-ecs-task-execution-role-arn>
      TaskRoleArn: '<your-ecs-task-execution-role-arn>'
      RequiresCompatibilities:
        - FARGATE
      RuntimePlatform:
        CpuArchitecture: X86_64
        OperatingSystemFamily: LINUX 
  ECSService:
    Type: 'AWS::ECS::Service'
    Properties:
      ServiceName: ecs-learning-service
      Cluster: !Ref ECSCluster
      DesiredCount: 1
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - your-ecs-security-group-id
          Subnets:
            - your-private-subnet-id
            - your-private-subnet-id
      TaskDefinition: !Ref ECSTaskDefinition

your-xxxx系の箇所は、適時ご自身の今までのECSアプリケーション作成講座手順で作成した
AWSリソースのid値、ARNに置き換えてください。

  1. 作成したcfテンプレートをアップロードする。
  2. スタックの名前を記載する。
  3. 諸々のオプションは今回は設定せずスキップ。(Cloudformationの講座ではないので詳細は割愛)
  4. 確認画面で諸々の設定値を確認し、送信をクリックする。
  5. あとはECSクラスター、ECSサービス、ECSタスクが作成するので完了まで見守ります。

ここまで実施することで、ECSタスクが正常に動作していることがECSタスクの状況とCloudwatchログから確認できると思いますが、肝心のECSタスクで稼働しているhttpdのウェブサーバーにアクセスできません。
ECSタスクをプライベートサブネットに作成しており、NATゲートウェイがアウトバウンドの通信をうまく調節してIGWに飛ばしてくれますが、インターネットからくるインバウンドの通信に対応しているわけではないためです。
インターネットからアクセス可能にするために後編ではアプリケーションロードバランサーを用意します。

Discussion

ログインするとコメントできます