【AWS】AWS CLIからECSタスクにパッチを適用する

# はじめに
4/15に、AWS東京リージョンで障害があったそうですね。
https://news.yahoo.co.jp/articles/7dc0aa344ae5bf2f52ccb5c6140e07ca3367c396

幸い自分がいる案件では、今回の障害による影響はありませんでした。
一応Health Dashboardを確認してみると、以下のような通知が届いていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751890/43efc1f4-2d4a-458b-8a54-718da9c1b3a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751890/d3646126-9066-4e5d-9caf-b10e82b31298.png)

なんか英語でやいのやいの書いてありますが…要約すると↓

「Fargate使ってるヤツらー！障害起きたから、4/17の11時(JST)にタスクのメンテナンス実行するぞー。
11時にメンテされるの嫌なヤツらはあらかじめ以下に書いてあるコマンドをAWS CLIから叩いて、タスクを新しく起動しとけよなー。」

的な感じのことが書いてありました。
一応原文には午前2時って書いてありますが、JSTの場合はプラス9時間なので昼間の11時なわけです。思いっきし仕事してる時間ですね。そんな時間にタスクのアップデートが入るのはまあさすがに困ります。

なので、あらかじめCLIからコマンド叩いて、予告された時間より前にアップデートを終わらせておくことにしました。と言っても、AWS CLIは使ったことがなかったので、実際にCLIの導入からパッチ適用までの一連の流れを、備忘録も兼ねて記事にすることにしました。

# AWS CLIの導入
AWS初学者の自分のイメージでは、てっきりマネジメントコンソール上にターミナルみたいなのがあって、そこから直接コマンドを打てるものだと思ってましたが、どうやら違うみたいです。

流れとしては、

①**AWS CLIをインストールする**
↓
②**マネジメントコンソールから、CLIを叩く用のIAMユーザーを作成する**
↓
③**コマンドプロンプトからCLIの設定を行う**
↓
④**Health dashoboardに書いてあったパッチ適用コマンドを叩く**

といった感じです。

## AWS CLIのインストール
まずはここからAWS CLIをインストールします。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

これをインストールすることで、コマンドプロンプトからAWS環境に向けてコマンドを叩けるようになります。

## CLI叩く用のIAMユーザーを作成
マネジメントコンソールに、**ルートユーザー**もしくは**IAMユーザーを作成できる権限を持つユーザー**でログインします。

[IAM]にアクセスし、画面左側のメニューから[**ユーザー**]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751890/eb5dd9d2-a3f1-489c-8867-98f4ea863680.png)

[**ユーザーの作成**]から、ユーザーの詳細の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751890/7678360d-ff22-42f3-b99d-3fb4318ac9fd.png)

[許可のオプション]は[**ポリシーを直接アタッチする**]を選択し、許可ポリシーにECS関連のポリシーを選択します。
今回は**AmazonECS_FullAccess**を選びました。最小権限の原則的にはよくないかもしれませんが…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751890/75b83655-1a12-4d28-9098-9f28a4f06301.png)

上記設定を終えて[ユーザーの作成]を実施することで、IAMユーザーが作成されます。

次に、IAMのユーザー一覧から作成したユーザーの詳細を開き、**アクセスキーID**と**シークレットアクセスキー**を取得します。

[アクセスキーを作成]から、ユースケースは[**コマンドラインインターフェース(CLI)**]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1751890/8b1b7680-251d-4afc-b3ac-9aead90287d9.png)

ここで取得したアクセスキーは、CLIからコマンドを叩くのに必要になるのでどっかにメモしといてください。できれば**Secret Manager**とか使えるとよいです。

## コマンドプロンプトでのAWS CLI設定

コマンドプロンプトを開き、以下のコマンドを入力します。
```
aws configure
```

コマンド実行後、以下のようなプロンプトが表示されます。
ここで、先ほど取得したアクセスキーIDとシークレットアクセスキーを入力します。
``Default region name``にはap-northeast-1（東京リージョン）を、``Default output format``にはjsonを入力します。
```
AWS Access Key ID [None]: <your-access-key-id>
AWS Secret Access Key [None]: <your-secret-access-key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

設定が完了したら、以下コマンドを入力します。
設定されたIAMユーザー情報が表示されたら準備完了です。
```
aws sts get-caller-identity
```

## ECSパッチ適用コマンドを叩く

Health Dashboardにあったパッチ適用コマンドを叩きましょう。
```
aws ecs update-service --cluster <cluster-name> --service <service-name> --force-new-deployment
```

一応補足すると、上記コマンドはECSサービスのデプロイメントタイプが「**Rolling Update**」の場合に使えるコマンドです。
そうじゃない場合は別のコマンドを叩く必要があります、詳しくは調べてください。

コマンドを叩いて、以下のような実行結果になったら成功です。
```
{
    "service": {
        "serviceArn": "arn:aws:ecs:ap-northeast-1:○○",
        "serviceName": "○○",
        "clusterArn": "arn:aws:ecs:ap-northeast-1:○○",
        "loadBalancers": [
            {
                "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:○○",
                "containerName": "○○",
                "containerPort": <ポート番号>
            }
        ],
        "serviceRegistries": [],
        "status": "ACTIVE",
        "desiredCount": 2,
        "runningCount": 2,
        "pendingCount": 0,
        "capacityProviderStrategy": [
            {
                "capacityProvider": "FARGATE",
                "weight": 1,
                "base": 0
            }
        ],
        "platformVersion": "LATEST",
        "platformFamily": "Linux",
        "taskDefinition": "arn:aws:ecs:ap-northeast-1:○○",
-- More  --
```

一応、マネジメントコンソール上からもECSサービスを確認し、ちゃんとタスクが実行されているかも確認するとよいでしょう。

# おわりに
正直CLIはなんか苦手意識があって毛嫌いしていましたが、冷静に考えればこんな文字列を叩くだけでアップデートできるのは便利かもしれないですね。
上司からも「CLIが使えればAWSの世界が広がる」と言われたので、少しづつ使えるようになっていきたいなと思います。