こんにちは。よっしーです(^^)
今日は、Amazon ECS CLI を利用してローカルでコンテナを起動する方法についてご紹介します。
背景
Amazon ECS CLI を利用してECSのタスク定義をもとにローカルでコンテナを起動する方法をご紹介します。
Amazon CLIの設定
Amazon CLI のバージョンを指定します。
asdf local awscli 2.13.7
詳しくは下記のサイトをご覧ください。
Amazon ECS CLIのインストール
Amazon ECS CLI のインストール手順は下記をご覧ください。
タスク定義のARNを取得
下記のコマンドを実施します。
task_def_arn=$(aws ecs describe-task-definition --task-definition learn-ecs-task-definition --query "taskDefinition.taskDefinitionArn" --output text --profile terraform)
環境変数の設定
下記のコマンドを実施します。
# Rancher Desktopを使用している場合は下記が必要になります。
export DOCKER_HOST=unix:///Users/yskmrkm/.rd/docker.sock
export AWS_PROFILE=terraform
ローカル環境での起動
下記のコマンドを実施します。
ecs-cli local up --task-def-remote ${task_def_arn}
コマンドの実行が完了後に、下記のコマンドを実行します。
curl http://localhost
下記のようにnginxのレスポンスが確認できれば成功です。
% curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ローカル上でコンテナの起動ができれば、あとは通常のコンテナ操作が可能なので、もしECS上で想定した通りの挙動をしないといったような場合は、ローカルで起動させて、動作を確認するのに役立つことがあるかも知れません。
ローカル環境での停止
下記のコマンドを実施します。
ecs-cli local down --task-def-remote ${task_def_arn}
下記のような出力になれば成功です。
% ecs-cli local down --task-def-remote ${task_def_arn}
INFO[0000] Searching for containers from remote task definition arn:aws:ecs:ap-northeast-1:xxx:task-definition/learn-ecs-task-definition:n
INFO[0000] Stop and remove 1 container(s)
INFO[0000] Stopped container with id xxx
INFO[0000] Removed container with id xxx
INFO[0000] The network ecs-local-network has no more running tasks
INFO[0000] Stopped container with name amazon-ecs-local-container-endpoints
INFO[0000] Removed container with name amazon-ecs-local-container-endpoints
INFO[0000] Removed network with name ecs-local-network
解説
docker-compose.ecs-local.yml
このYAMLファイルは、DockerコンテナをAmazon ECS(Elastic Container Service)で実行するためのタスク定義を定義しています。以下に、このYAMLファイルの内容にコメントを追加しました。
version: "3.4" # ECSのタスク定義のバージョンを指定
services:
learn_ecs_nginx: # サービス名(コンテナの実行単位)を指定
environment: # コンテナ内の環境変数を指定
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: /creds # ECSタスク内のコンテナに与えられるIAMロールの認証情報へのパス
ECS_CONTAINER_METADATA_URI: http://169.254.170.2/v3 # コンテナのメタデータ情報へのURI
image: xxx.dkr.ecr.ap-northeast-1.amazonaws.com/learn_aws_ecr:0.0.1 # コンテナのDockerイメージを指定
labels: # カスタムラベルを指定
ecs-local.task-definition-input.type: remote # カスタムラベルの設定
ecs-local.task-definition-input.value: arn:aws:ecs:ap-northeast-1:xxx:task-definition/learn-ecs-task-definition:10 # カスタムラベルの設定
logging: # ロギング設定
driver: awslogs # ログをAmazon CloudWatch Logsに送信する
options:
awslogs-create-group: "true" # 新しいロググループを作成
awslogs-group: /ecs/learn-ecs-task-definition # ロググループ名
awslogs-region: ap-northeast-1 # ログを送信するAWSリージョン
awslogs-stream-prefix: ecs # ログストリームのプレフィックス
networks:
ecs-local-network: null # 使用するネットワークの指定
ports:
- target: 80 # コンテナ内のポート番号
published: 80 # ホストマシンのポート番号
protocol: tcp # 通信プロトコル
networks:
ecs-local-network: # 使用するネットワークの定義
external: true # 外部ネットワークを使用
DockerコンテナをECS上で実行する際の設定情報が含まれています:
version
: ECSのタスク定義のバージョンを指定します。services
: 実行するコンテナのサービスを定義します。この例では、learn_ecs_nginx
という名前のサービスを定義しています。environment
: コンテナ内で使用される環境変数を指定します。IAMロールの認証情報やコンテナのメタデータ情報へのURIが含まれています。image
: 実行するDockerコンテナのイメージを指定します。labels
: カスタムラベルを指定します。この例では、タスク定義に関連する情報をカスタムラベルとして追加しています。logging
: ロギングの設定を行います。CloudWatch Logsにログを送信するための情報が含まれています。networks
: 使用するネットワークの定義を行います。この例では、外部ネットワークを使用しています。
このYAMLファイルを使用してECS上でコンテナを実行する際には、各項目の設定が適切であることを確認する必要があります。
docker-compose.ecs-local.override.yml
このYAMLファイルは、DockerコンテナをAmazon ECS(Elastic Container Service)で実行する際のタスク定義を定義しています。以下で具体的な設定内容を説明します。
version: "3.4" # ECSのタスク定義のバージョンを指定
services:
learn_ecs_nginx: # サービス名(コンテナの実行単位)を指定
logging: # ロギングの設定
driver: json-file # ログをファイルとして保存するドライバを指定
この設定では、以下のような動作が行われます:
version
: ECSのタスク定義のバージョンを指定します。この例では3.4
を使用しています。services
: 実行するコンテナのサービスを定義します。この例ではlearn_ecs_nginx
という名前のサービスを定義しています。logging
: ロギングの設定を行います。この例ではログのドライバとしてjson-file
を指定しています。これにより、コンテナ内のログがJSON形式のファイルとして保存されます。
この設定では、learn_ecs_nginx
サービスのコンテナが実行される際に、そのコンテナ内で生成されるログがJSONファイルとして保存されるようになります。このログはEC2インスタンス内のファイルとして保持され、後で確認や分析が行えるようになります。ただし、具体的なファイルの保存場所などの詳細は、ECSクラスタやインスタンスの設定に依存します。
おわりに
今日は、Amazon ECS CLI を利用してローカルでコンテナを起動する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント