やりたいこと
awscliを利用してECSのタスクが起動するサブネットを指定したサブネットのみにしたい。
環境情報
$ aws --version aws-cli/2.15.23 Python/3.11.6 ...
やり方
以下のようにサービスを指定し、subnetsに起動させたいサブネットのみを記載する。
$ aws ecs update-service --cluster test-cluster --service test-service --force-new-deployment --network-configuration "awsvpcConfiguration={subnets=[subnet-xx],securityGroups=[sg-xx],assignPublicIp=DISABLED}"これにより、タスク数が2以上の場合も全て指定したサブネット上で起動する。
以下、補足です。
補足
基本的には紐付けられている全てサブネットに分散してデプロイされるため、一つのサブネットにタスクが集中することは起きないようになっています。よってあえてサブネットを絞りたいケースは少ないとは思いますが、必要時には同コマンドで行うことも可能です。
尚、クラスター名を指定するとタスクが属するサブネットを表示するスクリプトも準備したので共有します。
#!/bin/bash CLUSTER_NAME="xxx" echo "Service Name | Task ID | Subnet ID" echo "-------------|---------|----------" SERVICES=$(aws ecs list-services --cluster $CLUSTER_NAME --query 'serviceArns[]' --output text) for SERVICE_ARN in $SERVICES do SERVICE_NAME=$(echo $SERVICE_ARN | awk -F'/' '{print $NF}') TASK_ARNS=$(aws ecs list-tasks --cluster $CLUSTER_NAME --service-name $SERVICE_NAME --query 'taskArns[]' --output text) for TASK_ARN in $TASK_ARNS do TASK_INFO=$(aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $TASK_ARN) TASK_ID=$(echo $TASK_ARN | awk -F'/' '{print $NF}') SUBNET_ID="Unknown" if echo "$TASK_INFO" | jq -e '.tasks[0].attachments' > /dev/null; then SUBNET_ID=$(echo "$TASK_INFO" | jq -r '.tasks[0].attachments[0].details[] | select(.name == "subnetId") | .value') elif echo "$TASK_INFO" | jq -e '.tasks[0].containerInstanceArn' > /dev/null; then CONTAINER_INSTANCE_ARN=$(echo "$TASK_INFO" | jq -r '.tasks[0].containerInstanceArn') CONTAINER_INSTANCE_INFO=$(aws ecs describe-container-instances --cluster \$CLUSTER_NAME --container-instances $CONTAINER_INSTANCE_ARN) EC2_INSTANCE_ID=$(echo "$CONTAINER_INSTANCE_INFO" | jq -r '.containerInstances[0].ec2InstanceId') SUBNET_ID=$(aws ec2 describe-instances --instance-ids $EC2_INSTANCE_ID | jq -r '.Reservations[0].Instances[0].SubnetId') fi echo " $SERVICE_NAME | $TASK_ID | $SUBNET_ID" done done
以上、ご参考になれば幸いです。