AWS Fargateを初めて見るー

Cover image for A First Look at AWS Fargate

アウトライン

このプロジェクトのすべてのコードは、私のGitHub上のFirst Lookモノレポで見つけることができます。

はじめに

Fargate は、ECS上でサーバーまたはEC2インスタンスのクラスターを管理することなくコンテナを実行できるAWSサービスです。それには、サーバータイプの選択、クラスターの規模拡大のタイミングの決定、クラスターパッキングの最適化が含まれます。

Fargate起動タイプでタスクとサービスを実行するには、アプリケーションをコンテナにパッケージングし、CPUとメモリの要件を指定し、ネットワークとIAMポリシーを定義し、アプリケーションを起動する必要があります。各Fargateタスクには自身の分離境界があり、他のタスクとの下層カーネル、CPUリソース、メモリリソース、または弾性ネットワークインターフェースを共有しません。

このチュートリアルでは、次のことを学びます:

例: コンテナタスク定義

タスク定義は、Amazon ECSでDockerコンテナを実行するために必要です。指定できるパラメータには以下のようなものがあります:

パラメータ 定義
image タスク内のそれぞれのコンテナに対するDockerイメージ
cpu, memory タスクごと、またはタスク内の各コンテナに対するCPUとメモリ
requiresCompatibilities タスクがホストされるインフラストラクチャを決定する起動タイプ
networkMode タスク内のコンテナのDockerネットワーキングモード
logConfiguration タスクのログ設定
command コンテナ起動時に実行されるコマンド
volumes タスク内のコンテナのためのデータボリューム
executionRoleArn タスクが使用するIAMロール

このタスク定義は、Fargate起動タイプを使ってウェブサーバーをセットアップし、Apacheのhttpd:2.4イメージを使用します。コンテナはsample-fargate-appという名前で、ログ設定とポートマッピングが含まれています。エントリポイントとしてsh -cをセットし、シェルcommandを実行してHTMLドキュメントをindex.htmlというファイルに出力します。これはusr/local/apache2/htdocs/ディレクトリ内に配置されます。

{
  "containerDefinitions": [{
    "command": [
      "/bin/sh -c \"echo '<html><head><title>ECS Sample App</title></head><body><div>
      <h1>ECS Sample App</h1><p>App running on a container in Amazon ECS.</p>
      </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
    ],
    "entryPoint": [ "sh", "-c" ],
    "essential": true,
    "image": "httpd:2.4",
    "logConfiguration": { 
      "logDriver": "awslogs",
      "options": { 
        "awslogs-group" : "/ecs/fargate-task-definition",
        "awslogs-region": "us-east-1",
        "awslogs-stream-prefix": "ecs"
      }
    },
    "name": "sample-fargate-app",
    "portMappings": [{ 
      "containerPort": 80,
      "hostPort": 80,
      "protocol": "tcp"
    }]
  }],
  "cpu": "256",
  "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
  "family": "fargate-task-definition",
  "memory": "512",
  "networkMode": "awsvpc",
  "requiresCompatibilities": [ "FARGATE" ]
}

最後に、httpd (containerPortおよびhostPort80に設定し)をスタートします。networkModeは、タスクがAmazon EC2インスタンスと同じネットワーキング属性を割り当てられることを意味するawsvpcに設定しています。これには、独自のelastic network interface (ENI)とプライマリのプライベートIPv4アドレスが含まれています。

ECS CLIをPGP署名でセットアップ・検証

オペレーティングシステムごとに、Amazon ECS CLIバイナリのダウンロード手順は異なります。この記事の指示はmacOS(特にM1)用です。WindowsまたはLinuxに対するAWSドキュメントでインストール手順を見つけましょう。次のcurlコマンドでECS CLIインストールスクリプトを実行します:

sudo curl -Lo /usr/local/bin/ecs-cli \
  https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest

sudoは、システムディレクトリ内のファイルがroot権限を必要としているため必要です。

GnuPGをインストールして、ECS PGP公開鍵用のファイルを作成

Amazon ECS CLI実行ファイルにはPGP署名を使用して暗号署名されています。PGP署名は、Amazon ECS CLI実行ファイルの妥当性を検証するために使用できます。HomebrewGnuPGをダウンロードしてインストールします。

brew install gnupg

公開鍵ブロックについては、Step 2: Verify the Amazon ECS CLI using PGP signaturesを参照してください。

touch aws-ecs-pgp

Amazon ECS PGP公開鍵の詳細についてはこちらを参照してください。

Key ID: BCE9D9A42D51784F
Type: RSA
Size: 4096/4096
Expires: Never
User ID: Amazon ECS
Key fingerprint: F34C 3DDA E729 26B0 79BE AEC6 BCE9 D9A4 2D51 784F

ECS PGP公開鍵をインポート

gpg --import aws-ecs-pgp

ECS CLI署名をダウンロードして検証

署名は、拡張子が.ascのASCII分離型PGP署名で保存されています。

curl -Lo ecs-cli.asc \
  https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest.asc

署名ファイルは、対応する実行可能ファイルと同じ名前ですが、.ascが追加されています。

gpg --verify ecs-cli.asc \
  /usr/local/bin/ecs-cli

出力には、あなたの個人的なPGPキーとAmazon ECS PGPキーの間に信頼の連鎖がないという警告が含まれているはずです。

Signature made Tue Apr 3 13:29:30 2018 PDT using RSA key DE3CBD61ADAF8B8E
Good signature from "Amazon ECS <ecs-security@amazon.com>" [unknown]

WARNING: This key is not certified with a trusted signature!
There is no indication that the signature belongs to the owner.

Primary key fingerprint: F34C 3DDA E729 26B0 79BE AEC6 BCE9 D9A4 2D51 784F
Subkey fingerprint: EB3D F841 E2C9 212A 2BD4 2232 DE3C BD61 ADAF 8B8E

CLIバイナリに実行権限を適用

ファイル名の後にchmod +xを実行すると、そのファイルが実行可能になります。

sudo chmod +x /usr/local/bin/ecs-cli

CLIバージョン番号を確認

amazon-ecs-cliの変更ログで現在のバージョンを確認してください。

ecs-cli --version

出力:

ecs-cli version 1.21.0 (bb0b8f0)

AWSクレデンシャルとIAMロールを設定

Amazon ECS CLIを使用する前に、AWSクレデンシャル、AWSリージョン、Amazon ECSクラスター名でECS CLIを設定する必要があります。

詳細は公式ドキュメントに従ってCLIを設定してください。AWSアカウントが必要です。一般的には、aws configureを使用したAWS CLIのセットアップが最も早い方法として推奨されています。

aws configure

My Security CredentialsでAccess Key ID、Secret Access Key、デフォルトリージョンを確認します。出力フォーマットについては空白のままにできます。

AWS Access Key ID: <YOUR_ACCESS_KEY_ID>
AWS Secret Access Key: <YOUR_SECRET_ACCESS_KEY>
Default region name: <YOUR_REGION_NAME>
Default output format [None]: 

Amazon ECSコンテナエージェントは、あなたの代わりにAWS APIを呼び出すために、IAMポリシーとロールが必要になります。IAMロールは特定の権限を持つIAMアイデンティティです。

IAMロールは、IAMユーザーのようなAWSのアイデンティティですが、特定の人物と密接に関連づけられているわけではなく、必要な人が誰でも使えることを意図しています。

ディレクトリとプロジェクト・ファイルを作成

CLIを設定した後、空のディレクトリを作成し、以下の3つのファイルが必要です。

  • アプリケーションのタスク実行IAMロールを設定するためのtask-execution-assume-role.json
  • イメージを指定し、コンテナを実行し、ログを設定するdocker-compose.yml
  • ECS特有のパラメータを設定する

    こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
    https://dev.to/ajcwebdev/a-first-look-at-aws-fargate-395f