(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【AWS】awsコマンドでECSのタスクが起動するサブネットを片寄する

スポンサーリンク

やりたいこと

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

以上、ご参考になれば幸いです。