AWS Fargate ソフトウェアアップデートの更新コマンドを試してみた

# はじめに
apache　ECS Fargateを構築後、今後のためにメンテナンス通知来た際に備えて
個人的にcloudshellにてソフトウェアアップデートのコマンドを試してみました。


**apache Fargate**
以下のサイトは初心者の私でも簡単に構築できる手順になっていました。大変助かりました。
https://dev.classmethod.jp/articles/ecs-fargate-entry-new-console/

**ソフトウェアアップデートの更新コマンド手順**
以下のサイトもソフトウェアアップデートの更新コマンドが勉強になりました。
以下の記事をもとに実際に検証してみました。
https://qiita.com/sam_eng3336/items/2b882784833234cbbbc2

**aws-nukeツールですべて一括削除しました**

作業後、ECSをすべて削除しました。
https://qiita.com/gama1234/items/3ac78634ae5b60c73493

## 構築後のコンテナ
**クラスター**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/3f44d14d-7b0e-f7d9-27e6-b120e535fbec.png)

**タスク**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/4de2311f-a93f-7896-b0e4-2afd080bfc9c.png)

**コンテナ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/df00f97b-510e-4ba6-4dcb-b6ce807e05d2.png)

## サービスのアップデート日時を確認した
恐らくサービスのアップデート日時が表示されているように見えます。
ECSのサービスを作成したばかりのため、時間帯が2023/4/1 12時ごろになっています。
```
[cloudshell-user@ip-10-4-49-31 ~]$ aws ecs describe-services --cluster test-ecs-cluster --services httpd-service | jq -r '.services[] | .serviceName, .launchType, .platformVersion, .deployments[].createdAt'
httpd-service
FARGATE
LATEST
2023-04-01T03:27:51.869000+00:00 ※おそらくデプロイした時間帯です。UTC表示です。
```

## アップデートコマンド
以下のコマンドを実行しました。
```
aws ecs update-service --service ＜サービス名＞ --cluster ＜クラスタ名＞ --force-new-deployment
例)
aws ecs update-service --service httpd-service --cluster test-ecs-cluster --force-new-deployment
```
EnterをENDが見えるまでひたすら押して、ENDの画面で止まったら「:q」で終了しました。
```
[cloudshell-user@ip-10-4-49-31 ~]$ aws ecs update-service --service httpd-service \
> --cluster test-ecs-cluster --force-new-deployment

実行結果です。
{
    "service": {
        "serviceArn": "arn:aws:ecs:ap-northeast-1:AWSアカウント番号:service/test-ecs-cluster/httpd-service",
        "serviceName": "httpd-service",
        "clusterArn": "arn:aws:ecs:ap-northeast-1:AWSアカウント番号:cluster/test-ecs-cluster",
        "loadBalancers": [],
        "serviceRegistries": [],
        "status": "ACTIVE",
        "desiredCount": 1,
        "runningCount": 1,
        "pendingCount": 0,
        "launchType": "FARGATE",
        "platformVersion": "LATEST",
        "platformFamily": "Linux",
        "taskDefinition": "arn:aws:ecs:ap-northeast-1:AWSアカウント番号:task-definition/httpd_task:1",
        "deploymentConfiguration": {
            "deploymentCircuitBreaker": {
                "enable": true,
                "rollback": true
            },
            "maximumPercent": 200,
            "minimumHealthyPercent": 100
        },
        "deployments": [
            {
                "id": "ecs-svc/4824319245695368515",
                "status": "PRIMARY",
                "taskDefinition": "arn:aws:ecs:ap-northeast-1:AWSアカウント番号:task-definition/httpd_task:1",
                "desiredCount": 0,
                "pendingCount": 0,
                "runningCount": 0,
                "failedTasks": 0,
                "createdAt": "2023-04-01T03:41:46.720000+00:00",
                "updatedAt": "2023-04-01T03:41:46.720000+00:00",
                "launchType": "FARGATE",
                "platformVersion": "1.4.0",
                "platformFamily": "Linux",
                "networkConfiguration": {
                    "awsvpcConfiguration": {
                        "subnets": [
                            "subnet-0977715a5a43735a5"
                        ],
                        "securityGroups": [
                            "sg-090012cedfc21da81"
                        ],
                        "assignPublicIp": "ENABLED"
                    }
                },
                "rolloutState": "IN_PROGRESS",
                "rolloutStateReason": "ECS deployment ecs-svc/4824319245695368515 in progress."
            },
            {
                "id": "ecs-svc/0853758844466569698",
                "status": "ACTIVE",
                "taskDefinition": "arn:aws:ecs:ap-northeast-1:AWSアカウント番号:task-definition/httpd_task:1",
                "desiredCount": 1,
                "pendingCount": 0,
                "runningCount": 1,
                "failedTasks": 0,
                "createdAt": "2023-04-01T03:27:51.869000+00:00",
                "updatedAt": "2023-04-01T03:28:17.380000+00:00",
                "launchType": "FARGATE",
                "platformVersion": "1.4.0",
                "platformFamily": "Linux",
                "networkConfiguration": {
                    "awsvpcConfiguration": {
                        "subnets": [
                            "subnet-0977715a5a43735a5"
                        ],
                        "securityGroups": [
                            "sg-090012cedfc21da81"
                        ],
                        "assignPublicIp": "ENABLED"
                    }
                },
                "rolloutState": "COMPLETED",
                "rolloutStateReason": "ECS deployment ecs-svc/0853758844466569698 completed."
            }
        ],
        "roleArn": "arn:aws:iam::AWSアカウント番号:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
        "events": [
            {
                "id": "11960243-2999-43e1-9db1-b370884b0cee",
                "createdAt": "2023-04-01T03:28:17.387000+00:00",
                "message": "(service httpd-service) has reached a steady state."
            },
            {
                "id": "81485b58-5264-4a10-99b8-7771a47b2e4b",
                "createdAt": "2023-04-01T03:28:17.386000+00:00",
                "message": "(service httpd-service) (deployment ecs-svc/0853758844466569698) deployment completed."
            },
            {
                "id": "2a4992d4-db23-47b2-bc58-f018c472f3d4",
                "createdAt": "2023-04-01T03:27:58.732000+00:00",
                "message": "(service httpd-service) has started 1 tasks: (task 6360de073f8a49458596b4ac474296ee)."
            }
        ],
        "createdAt": "2023-04-01T03:27:51.869000+00:00",
        "placementConstraints": [],
        "placementStrategy": [],
        "networkConfiguration": {
            "awsvpcConfiguration": {
                "subnets": [
                    "subnet-0977715a5a43735a5"
                ],
                "securityGroups": [
                    "sg-090012cedfc21da81"
                ],
                "assignPublicIp": "ENABLED"
            }
        },
        "schedulingStrategy": "REPLICA",
        "deploymentController": {
            "type": "ECS"
        },
        "createdBy": "arn:aws:iam::AWSアカウント番号:user/test_user1",
        "enableECSManagedTags": true,
        "propagateTags": "NONE",
        "enableExecuteCommand": false
    }
}
(END)
```
デプロイのステータスが進行中になりました。
上記のコマンドを実行するとイベントに以下のメッセージが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/3fb195d3-31bd-d4d8-ef09-b641d26da98d.png)



## サービスのアップデート日時を確認した
アップデートコマンドの実行日時になったため、イベント履歴を含めて確認することでサービスがアップデートされたことが分かりました。
```
アップデートコマンドを実行時刻「2023/4/1 12:51」になりました。
[cloudshell-user@ip-10-4-49-31 ~]$ aws ecs describe-services --cluster test-ecs-cluster --services httpd-service | jq -r '.services[] | .serviceName, .launchType, .platformVersion, .deployments[].createdAt'
httpd-service
FARGATE
LATEST
2023-04-01T03:51:54.510000+00:00 ※おそらくデプロイした時間帯です。
[cloudshell-user@ip-10-4-49-31 ~]$ 
```
デプロイが完了したら、デプロイステータスが「完了」になりました。
イベント情報も以下のメッセージが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/997d9712-51af-188e-d7bd-ff61981f5ddb.png)

## AWS-nukeツールでリソースを一括削除しました

ECSが削除されたことが分かりました。removeが削除です。
※以下はAWS nukeの処理を一部抜粋しました。
```
ap-northeast-1 - ECSTaskDefinition - arn:aws:ecs:ap-northeast-1:AWSアカウント番号:task-definition/httpd_task:1 - removed
ap-northeast-1 - CloudWatchLogsLogGroup - /ecs/httpd_task - [CreatedTime: "1680319113445", LastEvent: "2023-04-01T03:52:58Z", logGroupName: "/ecs/httpd_task"] - removed
ap-northeast-1 - EC2VPCEndpoint - vpce-0cf2a81ea4505c5f1 - [tag:Name: "test-vpce-s3"] - removed
ap-northeast-1 - EC2DHCPOption - dopt-069633c89ccf5b3ed - [DefaultVPC: "false"] - failed
ap-northeast-1 - EC2DefaultSecurityGroupRule - sgr-035e232151ffc7bfd - [SecurityGroupId: "sg-07f5d1c15b0d0b0a8"] - removed
ap-northeast-1 - EC2DefaultSecurityGroupRule - sgr-05e0f6365d4b77b4f - [SecurityGroupId: "sg-07f5d1c15b0d0b0a8"] - removed
ap-northeast-1 - ServiceDiscoveryNamespace - ns-hklk43lgcow4t7a3 - removed
ap-northeast-1 - ServiceDiscoveryNamespace - ns-mm3n5o2cij5hp5sw - removed
ap-northeast-1 - ServiceDiscoveryNamespace - ns-xqefcu25k6nmm3lu - removed
ap-northeast-1 - EC2VPC - vpc-043ee486bbc407d67 - [ID: "vpc-043ee486bbc407d67", IsDefault: "false", OwnerID: "AWSアカウント番号", tag:Name: "test-vpc"] - removed
ap-northeast-1 - CloudFormationStack - ECS-Console-V2-Service-httpd-service-test-ecs-cluster-0da74218 - [CreationTime: "2023-04-01T03:27:47Z", LastUpdatedTime: "2023-04-01T03:27:47Z", Name: "ECS-Console-V2-Service-httpd-service-test-ecs-cluster-0da74218"] - removed
ap-northeast-1 - CloudFormationStack - Infra-ECS-Cluster-test-ecs-cluster-82bbd752 - [CreationTime: "2023-04-01T03:20:29Z", LastUpdatedTime: "2023-04-01T03:20:29Z", Name: "Infra-ECS-Cluster-test-ecs-cluster-82bbd752"] - removed
ap-northeast-1 - CloudFormationStack - Infra-ECS-Cluster-testcluster-333d66ab - [CreationTime: "2023-04-01T02:24:05Z", LastUpdatedTime: "2023-04-01T02:24:05Z", Name: "Infra-ECS-Cluster-testcluster-333d66ab"] - removed
global - IAMVirtualMFADevice - arn:aws:iam::AWSアカウント番号:mfa/test_user1 - removed
global - IAMUserPolicyAttachment - test_user1 -> AdministratorAccess - [PolicyArn: "arn:aws:iam::aws:policy/AdministratorAccess", PolicyName: "AdministratorAccess", UserName: "test_user1"] - removed
global - IAMLoginProfile - test_user1 - [UserName: "test_user1"] - removed
global - IAMRolePolicyAttachment - ecsTaskExecutionRole -> AmazonECSTaskExecutionRolePolicy - [PolicyArn: "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", PolicyName: "AmazonECSTaskExecutionRolePolicy", RoleCreateDate: "2023-04-01T02:10:27Z", RoleLastUsed: "2023-04-01T03:42:16Z", RoleName: "ecsTaskExecutionRole", RolePath: "/"] - removed

Removal requested: 3 waiting, 2 failed, 79 skipped, 27 finished

ap-northeast-1 - EC2RouteTable - rtb-0499b633ac614758c - [DefaultVPC: "false"] - removed
ap-northeast-1 - EC2RouteTable - rtb-001e7f46a03a9c5a9 - [DefaultVPC: "false", tag:Name: "test-rtb-private1-ap-northeast-1a"] - removed
ap-northeast-1 - EC2RouteTable - rtb-070cf5ab579535d62 - [DefaultVPC: "false", tag:Name: "test-rtb-public"] - waiting
ap-northeast-1 - EC2Subnet - subnet-0977715a5a43735a5 - [DefaultForAz: "false", DefaultVPC: "false", OwnerID: "AWSアカウント番号", tag:Name: "test-subnet-public2-ap-northeast-1c"] - removed
ap-northeast-1 - EC2DHCPOption - dopt-069633c89ccf5b3ed - [DefaultVPC: "false"] - removed

Removal requested: 1 waiting, 0 failed, 79 skipped, 31 finished
```

## 翌日料金確認
本記事の作業でかかった料金が0ドルでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/9f7ff693-bca3-7f29-a73b-82569d97f931.png)

タスク定義(料金発生しない)→クラスター作成(料金発生しない)→サービス作成(料金発生しない)→タスクをデプロイして起動する(料金発生する)

上記であると想定で思います。
検証の時はタスクを実行中した後にすぐに削除したため、料金がかからなかったと思われます。


## 料金計算ツールでFargateを確認した

Fargate料金については以下のサイトが参考になりました。
https://qiita.com/nishinoshake/items/a90c93675b2b9245ffb2

Fargateの検証した際のサイズ　0.25vCPU メモリ0.5GB　9時～13時まで検証しました。
※こちらの計算は4時間タスクを実行中にした場合の計算と思われます。

かなり大雑把な計算としては以下となります。
```
※今回 0.25vCPU/0.5GBで検証
vCPU = 0.25*0.05056USD * 4時間 = $0.05056
メモリ= 0.5*0.00553USD * 4時間 = $0.01106

合計　 USD　※1ドル = 132.86円

0.06162 USD * 132.86 = 8.1868332円

```
## 4/5に再度料金を確認してみた
4/2に料金確認した際は0ドルでしたが、4/5で確認したら0.01ドルになってました。
0.01*131.82=1.3円ぐらい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/cced92b2-4b93-5078-4bc5-be6184ad9ffd.png)


**念のため、リソースの削除漏れを確認しました**

以下のサイトが参考になります。
引用
「予期しない請求が発生しないようにするために、使用しなくなったアクティブなリソースがあるかどうかを定期的にチェックすることをお勧めします。」
https://repost.aws/ja/knowledge-center/check-for-active-resources

アクティブなリソースがないかタグエディタで確認しました。
サービス > AWS Resource Groups をクリックする
左ペインのタグエディタを選択してリージョンは「All regions」リソースタイプは「All supported resource types]」
を選択します。その後、リソースを検索ボタンを押しました。CSVエクスポートを押しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/50d6c947-4fac-565d-a05f-23c3efd13de9.png)


文字化けはしていますが、EXCELのフィルタ機能をつかったところ、すべて料金がかからないサービスのみが表示されました。

以下でフィルター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/7984eda6-a931-668a-6bdf-6ed9ec9beca7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/77f28b2a-4003-e485-4f4b-6fe2000486c7.png)



# まとめ
Fargateの構築はクラスターのサービス作成した際に、何らかの設定ミスによりタスクのデプロイが繰り返す無限ループが起きる可能性があります。上記の事象発生時はクラスターを削除に失敗しました。
繰り返しコンソール上でクラスターの削除をしつづけたら何とか削除出来ました。
**そのため、サービスを作成する際は設定に不備がないか確認してください。**
今振り返れば、apacheのイメージのURLを指定せずに「httpd」と設定したため、
イメージ取得に失敗して繰り返しタスクのデプロイが起きた可能性は高いです。
上記については再現出来たら次回記事にしたいです。

初心者でもECS Fargate apacheは簡単に構築できることが分かりました。
また手を動かすことでコンテナ > タスク > サービス > クラスタであることが分かりました。
作業後は手動でサービスを消すよりは「aws-nuke」ツールは一括ですべて消せるため、検証環境であれば大変便利だと思いました。