継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

話題の DuckDB をローカルで実行できる準備を行う

タダです.

今年に入って DuckDB というワードを X やブログ記事を見かける体感が自分の中であり,この期に試してみたいと思っていくつかの記事で試した内容をまとめます.この記事では DuckDB の概要とローカルで実行する準備をします.

DuckDB とは

DuckDB はオープンソースの列指向データベースエンジンで,ローカル環境での分析やクラウドデータの簡単な処理に使用されているのがユースケースです.他には外部データの直接読み込み(S3 や Parquet,CSV など)をサポートしているので,ALB や CloudTrail 等の S3 に入っているログを分析することをやってみたいと思っています.

duckdb.org

github.com

DuckDB のインストール/AWS

そんなわけで DuckDB CLI をインストールしてみます.

$ brew install duckdb
$ duckdb -version
v1.1.3 19864453f7

duckdb コマンドを使って AWS のエクステンションを使用して AWS SDK を叩く前準備を行います.一旦,S3 の CSV ファイルを読み込んでみました.中身が空なのでこれでいいのか..ってなりつつなんですが,他にも試して次以降の記事で書いていきます.

2 ❯ duckdb
[2]  - 10871 continued  duckdb help
D INSTALL aws;
D LOAD aws;
D INSTALL httpfs;
D LOAD httpfs;
D CREATE SECRET (
    TYPE S3,
    KEY_ID 'AKIAIOSFODNN7EXAMPLE',
    SECRET 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
    REGION 'ap-northeast-1'
);
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true    │
└─────────┘
D SELECT * FROM read_csv('s3://hoge-bucket/hoge.csv',delim=' ', header=false, ignore_errors=true);
┌─────────┬─────────┐
│ column0 │ column1 │
│ varchar │ varchar │
├─────────┴─────────┤
│      0 rows       │
└───────────────────┘

duckdb.org

duckdb.org

duckdb.org

まとめ

DuckDB を試していくための前準備でセットアップしてみました.

Aurora のバックアップを日次と月次で分けて AWS Backup にて保持する

タダです.

Aurora のバックアップを日次と月次で分けて AWS Backup で保持する設定を行ったので,備忘録としてまとめます.

日次と月次のバックアップジョブ

結論として日次と月次のバックアップジョブを分けて作りました.以下は日次で14日間まで保持するバックアッププランと,毎月1日のバックアップを3ヶ月保持するバックアッププランを作る Terraform のコード例です.

resource "aws_backup_plan" "daily" {
  name = "daily-backup"
  rule {
    rule_name         = "daily"
    target_vault_name = aws_backup_vault.example.name
    schedule          = "cron(0 12 * * ? *)"
    lifecycle {
      delete_after = 14 # days
    }
  }
}
resource "aws_backup_plan" "monthly" {
  name = "monthly-backup"
  rule {
    rule_name         = "monthly"
    target_vault_name = aws_backup_vault.example.name
    schedule          = "cron(0 12 1 * ? *)"
    lifecycle {
      delete_after = 90 # days
    }
  }
}
resource "aws_backup_selection" "daily" {
  name         = "daily-backup"
  plan_id      = aws_backup_plan.daily.id
  iam_role_arn = aws_iam_role.example.arn
  resources    = [
    aws_rds_cluster.example.arn,
  ]
}
resource "aws_backup_selection" "monthly" {
  name         = "monthly-backup"
  plan_id      = aws_backup_plan.monthly.id
  iam_role_arn = aws_iam_role.example.arn
  resources    = [
    aws_rds_cluster.example.arn,
  ]
}

まとめ

Aurora のバックアップを日次と月次で分けて AWS Backup で保持する設定を行ったのでまとめました.

ECR から不要なイメージを安全に削除する ecrm を検証してみた

タダです.

ECR のライフサイクルを使用して不要なコンテナイメージを削除する運用をしていて,特定の ECS タスクで使用していたコンテナイメージを削除してしまってタスクの起動が失敗する事象が発生しました.本件の再発防止を検討する際 CLI ツールの ecrm をチームで教えてもらいました.自分は初めて知ったので,どのように ECR からコンテナイメージを削除するのかを試しながら学んだことを本記事でまとめていきます.

github.com

下記のブログでツールの詳細が紹介されています.

techblog.kayac.com

ローカルに ecrm をインストール

自分の環境はMac なので brew install fujiwara/tap/ecrm で ecrm をインストールできます.コマンドのヘルプを実行してみると以下の結果がでます.

$ ecrm -h   
Usage: ecrm <command> [flags]

Flags:
  -h, --help                  Show context-sensitive help.
  -c, --config="ecrm.yaml"    Load configuration from FILE ($ECRM_CONFIG)
      --log-level="info"      Set log level (debug, info, notice, warn, error) ($ECRM_LOG_LEVEL)
      --[no-]color            Whether or not to color the output ($ECRM_COLOR)
      --version               Show version.

Commands:
  generate [flags]
    Generate a configuration file.

  scan [flags]
    Scan ECS/Lambda resources. Output image URIs in use.

  plan [flags]
    Scan ECS/Lambda resources and find unused ECR images that can be deleted safely.

  delete [flags]
    Scan ECS/Lambda resources and delete unused ECR images.

  version [flags]
    Show version.

Run "ecrm <command> --help" for more information on a command.

コンテナイメージの定義ファイルを生成する

ecrm generate で生成可能で ecrm.yaml が追加されます.以下の内容はプライベートアカウント内の ECS/Lambda で利用しているコンテナイメージを抽出してくれます.

clusters:
  - name: example
task_definitions:
  - name_pattern: hello-*
    keep_count: 5
  - name_pattern: sample-*
    keep_count: 5
lambda_functions:
  - name_pattern: hello-*
    keep_count: 5
repositories:
  - name_pattern: hello-*
    expires: 30d
    keep_count: 5
    keep_tag_patterns:
      - latest
  - name_pattern: sample-*
    expires: 30d
    keep_count: 5
    keep_tag_patterns:
      - latest

上記の設定ですと以下の条件外のコンテナイメージが削除されます.

  • ECSタスク定義に含まれるもの
    • 最新から5世代で使用されているコンテナイメージを保持
    • 実際にECSサービスやタスクで利用中のものがあれば保持
  • Lambda関数で指定されているもの
    • 最新バージョンから5世代で使用されているコンテナイメージを保持
  • イメージがプッシュされれてから30日以内のコンテナイメージを保持
  • イメージに latest タグが付いているものを保持

削除対象のコンテナイメージを確認する

ecrm で削除されるコンテナイメージを確認するには ecrm plan を使用します.以下はその結果ですが,EXPIRED 列でマイナスされた値が削除されるコンテナイメージの数と容量を表しています.sample-image という ECR のコンテナイメージが1つ削除される状況ですね.

                                REPOSITORY                                |    TYPE     |   TOTAL    |   EXPIRED   |    KEEP
---------------------------------------------------------------------------+-------------+------------+-------------+--------------
  hello-server                                                             | Image       | 0 (0 B)    |             | 0 (0 B)
  sample-image                                                             | Image       | 5 (116 MB) | -1 (43 MB)  | 4 (74 MB)

コンテナイメージを削除してみる

コンテナイメージを削除するには ecrm delete で実行可能です.インタラクティブに確認しながら削除することが可能です.自動化する場合は --force オプションを指定すれば削除対象のコンテナイメージを強制的に削除してくれます.

$ ecrm delete
~中略~
2024/11/24 14:06:59 [notice] Deleting sample-image sha256:e405d9249cfaf9bdaad043633a58cea1f1b68c5193c6deb30f131901b014d834
2024/11/24 14:06:59 [info] Deleted 1 images on sample-image
Do you delete 45 images on simple-express-repository? (y/n) [n]: y
2024/11/24 14:06:59 [notice] Deleting sample-image sha256:e405d9249cfaf9bdaad043633a58cea1f1b68c5193c6deb30f131901b014d834
2024/11/24 14:06:59 [info] Deleted 1 images on sample-image

まとめ

ECR のコンテナイメージを安全に削除するための CLI ツール ecrm をローカルで試した内容をまとめました.

既存のECS サービスを ALB のマルチターゲットグループ化する時に行った対応メモ✍

タダです.

既存の ECS サービスが ALB のターゲットグループに1つだけ関連付けられて稼働している状況で,もう1つターゲットグループを関連付けて2つのターゲットグループからリクエストを受けられる状態を作りたい時がありました.その時に AWS CLI を使って対応を行ったのですが,どういったフローを経て行ったのかを備忘録としてまとめます.

1. 既存 ECS サービスに2つのターゲットグループを関連付けるコマンド

既存 ECS サービスに2つのターゲットグループを関連付けるコマンドは以下の通りです.これで既存 ECS サービスがマルチターゲットグループ化できます.

$ aws ecs update-service \
  --cluster [ECS クラスター名] \
  --service [ECS サービス名] \
  --load-balancers "targetGroupArn=[ターゲットグループ1 ARN],containerName=[コンテナ名],containerPort=[ポート番号]" \
                   "targetGroupArn=[ターゲットグループ2 ARN],containerName=[コンテナ名],containerPort=[ポート番号]"

2. ECS サービスの新しいデプロイの強制を実行する

マルチターゲットグループのネットワーク設定はできましたが,追加したターゲットグループには ECS タスクがデプロイされてない状態なので Force new deployment(新しいデプロイの強制) を実行して新しいタスクを各マルチターゲットの対象になるようにします.

$ aws ecs update-service \
  --cluster [ECS クラスター名] \
  --service [ECS サービス名] \
  --force-new-deployment

以上でマルチターゲットグループで ECS サービスがリクエストを受けられる状態になりました.

まとめ

既存の ECS サービスを ALB のマルチターゲットグループ化する時に行った AWS CLI のコマンドをまとめました.癖で GUI からやろうとして導線がなくてちょっと戸惑いましたが,AWS CLI で簡単に設定できてよかったです.

ECS サービスデプロイ状況を確認する API サポートを試してみた

タダです.

ECS 関連アップデートでデプロイ状況を確認できる API のサポートが発表されました.普段デプロイの際はコンソールで確認を行っていたのでその手間が一定解消されそうだと思い,どんな確認が取れるのかを手元で CLI を試してみます.

aws.amazon.com

aws.amazon.com

今回アップデート概要

今回発表された API はlistServiceDeployments, describeServiceRevisions, describeServiceDeployment になります.また,ECS サービスのデプロイ履歴が90 日間保持されてコンソールとAWS CLI で確認が可能になりました.この記事では追加された API の挙動を CLI で確認した内容をまとめていきます.なお,CLI のバージョンは以下のとおりです.

$ aws --version
aws-cli/2.19.4 Python/3.12.7 Darwin/23.5.0 source/arm64

listServiceDeployments

listServiceDeployments では ECS サービスのデプロイごとの状況を確認できるようになっています.list-service-deployments を実行すると以下の例では2回のデプロイを試したのでその状況が表示されました.

awscli.amazonaws.com

$ aws ecs list-service-deployments --cluster example --service blog-demo
{
    "serviceDeployments": [
        {
            "serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:111222333444:service-deployment/example/blog-demo/xOuzLGQkLj4Fgx4pScx-F",
            "serviceArn": "arn:aws:ecs:ap-northeast-1:111222333444:service/example/blog-demo",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:111222333444:cluster/example",
            "startedAt": "2024-11-10T14:38:15.960000+09:00",
            "createdAt": "2024-11-10T14:38:14.578000+09:00",
            "targetServiceRevisionArn": "arn:aws:ecs:ap-northeast-1:111222333444:service-revision/example/blog-demo/0842152099039089140",
            "status": "IN_PROGRESS"
        },
        {
            "serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:111222333444:service-deployment/example/blog-demo/TpNdMFMET_zrLGeqX15se",
            "serviceArn": "arn:aws:ecs:ap-northeast-1:111222333444:service/example/blog-demo",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:111222333444:cluster/example",
            "startedAt": "2024-11-10T14:06:20.206000+09:00",
            "createdAt": "2024-11-10T14:06:18.128000+09:00",
            "finishedAt": "2024-11-10T14:26:15.246000+09:00",
            "targetServiceRevisionArn": "arn:aws:ecs:ap-northeast-1:111222333444:service-revision/example/blog-demo/1308369492597490708",
            "status": "ROLLBACK_FAILED",
            "statusReason": "No rollback candidate was found to run the rollback."
        }
    ]
}

コンソールで確認すると,デプロイごとに識別子が振られて後述する API で確認できる,デプロイの関連情報を得られるようになっているようです.

describeServiceDeployments

describeServiceDeployments では ECS タスク数やサーキット ブレーカーのステータスなどデプロイごとの詳細情報を取得できます.listServiceDeployments は全体を見て,describeServiceDeployments では個別のデプロイ詳細を確認するための用途のようですね.

awscli.amazonaws.com

$ aws ecs describe-service-deployments --service-deployment-arns arn:aws:ecs:ap-northeast-1:111222333444:service-deployment/example/blog-demo/xOuzLGQkLj4Fgx4pScx-F
{
    "serviceDeployments": [
        {
            "serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:111222333444:service-deployment/example/blog-demo/xOuzLGQkLj4Fgx4pScx-F",
            "serviceArn": "arn:aws:ecs:ap-northeast-1:111222333444:service/example/blog-demo",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:111222333444:cluster/example",
            "createdAt": "2024-11-10T14:38:14.578000+09:00",
            "startedAt": "2024-11-10T14:38:15.960000+09:00",
            "updatedAt": "2024-11-10T14:38:16.502000+09:00",
            "sourceServiceRevisions": [
                {
                    "arn": "arn:aws:ecs:ap-northeast-1:111222333444:service-revision/example/blog-demo/1308369492597490708",
                    "requestedTaskCount": 0,
                    "runningTaskCount": 0,
                    "pendingTaskCount": 0
                }
            ],
            "targetServiceRevision": {
                "arn": "arn:aws:ecs:ap-northeast-1:111222333444:service-revision/example/blog-demo/0842152099039089140",
                "requestedTaskCount": 0,
                "runningTaskCount": 0,
                "pendingTaskCount": 0
            },
            "status": "IN_PROGRESS",
            "deploymentConfiguration": {
                "deploymentCircuitBreaker": {
                    "enable": true,
                    "rollback": true
                },
                "maximumPercent": 200,
                "minimumHealthyPercent": 100
            },
            "deploymentCircuitBreaker": {
                "status": "MONITORING",
                "failureCount": 0,
                "threshold": 0
            },
            "alarms": {
                "status": "DISABLED"
            }
        }
    ],
    "failures": []
}

describeServiceRevisions

describeServiceRevisions ではどういった ECS タスクをデプロイしようとしているのか(タスク定義のバージョン,ネットワーク情報,コンテナ名等)を取得できます.従来は個々のタスク定義を見に行っていたのがこの API で確認できるようになりました.

awscli.amazonaws.com

aws ecs describe-service-revisions --service-revision-arns arn:aws:ecs:ap-northeast-1:111222333444:service-revision/example/blog-demo/0842152099039089140
{
    "serviceRevisions": [
        {
            "serviceRevisionArn": "arn:aws:ecs:ap-northeast-1:111222333444:service-revision/example/blog-demo/0842152099039089140",
            "serviceArn": "arn:aws:ecs:ap-northeast-1:111222333444:service/example/blog-demo",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:111222333444:cluster/example",
            "taskDefinition": "arn:aws:ecs:ap-northeast-1:111222333444:task-definition/blog-demo:2",
            "launchType": "FARGATE",
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "loadBalancers": [],
            "serviceRegistries": [],
            "networkConfiguration": {
                "awsvpcConfiguration": {
                    "subnets": [
                        "subnet-xxx",
                        "subnet-xxx"
                    ],
                    "securityGroups": [
                        "sg-xxx"
                    ],
                    "assignPublicIp": "DISABLED"
                }
            },
            "containerImages": [
                {
                    "containerName": "demo",
                    "image": "111222333444.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/amazonlinux/amazonlinux:2023"
                }
            ],
            "guardDutyEnabled": false,
            "createdAt": "2024-11-10T14:38:06.544000+09:00"
        }
    ],
    "failures": []
}

まとめ

ECS サービスデプロイに関連する新しい API サポートを受けて AWS CLI で関連コマンドを試してどういった内容を取得できるのかを確認しました.