kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Terraform で Amazon ECS の fargateTaskRetirementWaitPeriod を設定する

2024年5月17日にリリースされた Terraform AWS Provider v5.50.0 で Amazon ECS の「Fargate タスクリタイア待機時間 (fargateTaskRetirementWaitPeriod)」を設定できるようになった.

github.com

デフォルトでは「7日間」に設定されていて,選択肢としては 0日7日14日 を設定できる.基本的にはすぐにアップデートを反映しておくと良さそうだけど,Fargate タスクの停止に制約・課題がある場合は長めに設定しておくと良さそう.ちなみにブログ記事には 稀に重大なセキュリティアップデートがある場合は待機時間無しでリタイアさせる と書いてある📝

docs.aws.amazon.com

aws.amazon.com

さっそく試す

Amazon ECS の aws_ecs_account_setting_default リソースを使って設定する.以下の例では「Fargate タスクリタイア待機時間」0日 に設定している👌

resource "aws_ecs_account_setting_default" "main" {
  name  = "fargateTaskRetirementWaitPeriod"
  value = "0"
}

aws ecs list-account-setting コマンド

現時点ではマネジメントコンソールで fargateTaskRetirementWaitPeriod の設定を確認することができず,AWS CLI の aws ecs list-account-setting コマンドを使う必要がある👀

awscli.amazonaws.com

Before(terraform apply 実行前)

$ aws ecs list-account-settings --name fargateTaskRetirementWaitPeriod --effective-settings
{
    "settings": [
        {
            "name": "fargateTaskRetirementWaitPeriod",
            "value": "7",
            "principalArn": "arn:aws:iam::000000000000:root",
            "type": "user"
        }
    ]
}

After(terraform apply 実行後)

$ aws ecs list-account-settings --name fargateTaskRetirementWaitPeriod --effective-settings
{
    "settings": [
        {
            "name": "fargateTaskRetirementWaitPeriod",
            "value": "0",
            "principalArn": "arn:aws:iam::000000000000:root",
            "type": "user"
        }
    ]
}

AWS Step Functions の TestState API でステートをテストしよう!

AWS Step Functions ワークフローを実装しているときに,ステートをデプロイする前にテストしたり,デプロイしたワークフローの特定のステートのみを実行したいという場面があったりする.実は AWS Step Functions の「TestState API」を使うと,ワークフローをデプロイせずに1つのステートをテストできてスムーズに実装を進められる👌

ちなみに TestState API は2023年11月末にリリースされている❗️

aws.amazon.com

docs.aws.amazon.com

AWS CLI で TestState API を試す

AWS CLI の aws stepfunctions test-state コマンドを使えば TestState API を簡単に試せる.aws stepfunctions test-state コマンドの必須オプションは大きく2つ(--definition--role-arn)ある.--definition を指定するため,実際に AWS Step Functions ワークフローをデプロイする必要はなく,Amazon States Language (ASL) を直接指定してテストできる👌

awscli.amazonaws.com

1. Lambda Invoke を試す 🧩

実際に存在する AWS Lambda 関数を呼び出すステートを JSON で定義する📝

{
    "Type": "Task",
    "Resource": "arn:aws:states:::lambda:invoke",
    "OutputPath": "$.Payload",
    "Parameters": {
        "Payload.$": "$",
        "FunctionName": "arn:aws:lambda:ap-northeast-1:000000000000:function:xxxxxxx:$LATEST"
    },
    "End": true
}

ステートのイメージは以下のような感じ.

そしてコマンドを実行すると指定したワークフロー定義から AWS Lambda 関数を呼び出せた👏

$ aws stepfunctions test-state \
    --definition file://state.json \
    --role-arn arn:aws:iam::000000000000:role/xxxxx \
    --input '{ "key1": "value1", "key2": "value2" }'
{
    "output": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}",
    "status": "SUCCEEDED"
}

2. S3 PutObject を試す 🧩

次に AWS Step Functions の「SDK 統合」を使って,実際に存在する Amazon S3 バケットにオブジェクトを保存するステートを JSON で定義する📝

{
    "Type": "Task",
    "Resource": "arn:aws:states:::aws-sdk:s3:putObject",
    "Parameters": {
        "Body.$": "$.body",
        "Bucket": "xxxxxxxxxx",
        "Key": "aws-stepfunctions-test-state.txt"
    },
    "End": true
}

ステートのイメージは以下のような感じ.

そしてコマンドを実行すると指定したワークフロー定義から Amazon S3 バケットにオブジェクトを保存できた👏

$ aws stepfunctions test-state \
    --definition file://state.json \
    --role-arn arn:aws:iam::000000000000:role/xxxxx \
    --input '{ "body": "hello!" }'
{
    "output": "{\"ETag\":\"\\\"1092c22d20edf737ded7bfb149dd8c9e\\\"\",\"ServerSideEncryption\":\"AES256\"}",
    "status": "SUCCEEDED"
}

3. Choice (NumericEquals) を試す 🧩

今度は AWS Step Functions の Choiceドキュメントに載っている NumericEquals のサンプルを参考に分岐のあるステートを JSON で定義する📝

{
    "Type": "Choice",
    "Choices": [
        {
            "Variable": "$.foo",
            "NumericEquals": 1,
            "Next": "FirstMatchState"
        }
    ],
    "Default": "Success"
}

ステートのイメージは以下のような感じ.

分岐をテストするために { "foo": 1 }{ "foo": 100 } を指定してコマンドを実行すると,期待した nextState になっていることを確認できた👏

$ aws stepfunctions test-state \
    --definition file://state.json \
    --role-arn arn:aws:iam::000000000000:role/xxxxx \
    --input '{ "foo": 1 }'
{
    "output": "{ \"foo\": 1 }",
    "nextState": "FirstMatchState",
    "status": "SUCCEEDED"
}

$ aws stepfunctions test-state \
    --definition file://state.json \
    --role-arn arn:aws:iam::000000000000:role/xxxxx \
    --input '{ "foo": 100 }'
{
    "output": "{ \"foo\": 100 }",
    "nextState": "Success",
    "status": "SUCCEEDED"
}

4. Choice (IsNull) を試す 🧩

もう一つ AWS Step Functions の Choiceドキュメントに載っている IsNull のサンプルを参考に分岐のあるステートを JSON で定義する📝

{
    "Type": "Choice",
    "Choices": [
        {
            "Variable": "$.possiblyNullValue",
            "IsNull": true,
            "Next": "Fail"
        }
    ],
    "Default": "Success"
}

ステートのイメージは以下のような感じ.

分岐をテストするために { "possiblyNullValue": 12345 }{} を指定してコマンドを実行すると,期待した nextState になっていることを確認できた👏

$ aws stepfunctions test-state \
    --definition file://state.json \
    --role-arn arn:aws:iam::000000000000:role/xxxxx \
    --input '{ "possiblyNullValue": 12345 }'
{
    "output": "{ \"possiblyNullValue\": 12345 }",
    "nextState": "Success",
    "status": "SUCCEEDED"
}

$ aws stepfunctions test-state \
    --definition file://state.json \
    --role-arn arn:aws:iam::000000000000:role/xxxxx \
    --input '{}'
{
    "error": "States.Runtime",
    "cause": "Invalid path '$.possiblyNullValue': The choice state's condition path references an invalid value.",
    "status": "FAILED"
}

マネジメントコンソールで TestState API を試す

TestState API は AWS Step Functions のマネジメントコンソールでも使える❗️

デプロイ前のワークフローであれば AWS Step Functions Workflow Studio で テスト状態 というボタンを押す.さらにデプロイして実行した AWS Step Functions ワークフローに対しても,特定のステートを選択して テスト状態 というボタンを押せば,インプットを変更して実行できる👌個人的には テスト状態 という日本語訳が微妙で気付きにくいように思う💨

デプロイして実行した AWS Step Functions ワークフローのトラブルシューティングに TestState API を使うことが多く,複雑なワークフローを開発しているときに特に便利だな〜と感じる❗️

TestState API を自動テストに活用する

AWS Compute Blog のブログ記事 Accelerating workflow development with the TestState API in AWS Step Functions を読んでいたら,Jest から TestState API を実行してレスポンスの nextStatestatus を確認する自動テストに活用する例が載っていて参考になった📝

aws.amazon.com

Python でツリー構造を表現できる treelib

Python ライブラリ treelib を使うと簡単にツリー構造を表現できる.今まで使ったことがなくて,ドキュメントを見ながら基本的な操作を試してみた🌴

treelib.readthedocs.io

github.com

ちなみに treelib は「AWS コンピュータービジョン開発の教科書」を読んでいたら,Amazon Rekognition のラベル検出結果をツリー構造で表示するために使われていて,本のトピックと直接は関係ないけど「こんなのあるんだ〜💡」と気になってしまった \( 'ω')/

kakakakakku.hatenablog.com

サンプル

今回はサンプルとして以下のようなツリー構造を treelib で作って,気になった操作を試してみる❗️サポートされてる全ての操作はドキュメント参照📝

root
├── A01
│   └── A11
├── B01
│   ├── B11
│   └── B12
│       ├── B121
│       └── B122
└── C01
    ├── C11
    ├── C12
    └── C13

ツリー構造を作る

以下のように Tree()create_node() でツリー構造を簡単に表現できる.子ノードを作るときは create_node()parent を指定すれば OK👌

from treelib import Tree

tree = Tree()

root = tree.create_node('root')
a01 = tree.create_node('A01', parent=root)
a11 = tree.create_node('A11', parent=a01)
b01 = tree.create_node('B01', parent=root)
b11 = tree.create_node('B11', parent=b01)
b12 = tree.create_node('B12', parent=b01)
b121= tree.create_node('B121', parent=b12)
b122= tree.create_node('B122', parent=b12)
c01 = tree.create_node('C01', parent=root)
c11 = tree.create_node('C11', parent=c01)
c12 = tree.create_node('C12', parent=c01)
c13 = tree.create_node('C13', parent=c01)

表示する

show() を使えばツリー構造をそのまま表示できる.

# root
# ├── A01
# │   └── A11
# ├── B01
# │   ├── B11
# │   └── B12
# │       ├── B121
# │       └── B122
# └── C01
#     ├── C11
#     ├── C12
#     └── C13
print(tree.show(stdout=False))

JSON に変換する

to_json() を使えばツリー構造を JSON に変換して表示できる.

# {"root": {"children": [{"A01": {"children": ["A11"]}}, {"B01": {"children": ["B11", {"B12": {"children": ["B121", "B122"]}}]}}, {"C01": {"children": ["C11", "C12", "C13"]}}]}}
print(tree.to_json())

JSON をフォーマットすると以下のようになる💡

{
    "root": {
        "children": [
            {
                "A01": {
                    "children": [
                        "A11"
                    ]
                }
            },
            {
                "B01": {
                    "children": [
                        "B11",
                        {
                            "B12": {
                                "children": [
                                    "B121",
                                    "B122"
                                ]
                            }
                        }
                    ]
                }
            },
            {
                "C01": {
                    "children": [
                        "C11",
                        "C12",
                        "C13"
                    ]
                }
            }
        ]
    }
}

Graphviz に変換する

to_graphviz() を使えば .dot ファイルに変換できる.

tree.to_graphviz('tree.dot')

ファイルに出力する

save2file() を使えばツリー構造をそのままファイルに出力できる.

tree.save2file('tree.txt')

深さを確認する

depth() を使えばツリー構造の深さを確認できる.

# 3
print(tree.depth())

子ノードを取得する

children() を使えば子ノードのリストを取得できる.

# node.tag='B121' node.identifier='cc4caccc-023e-11ef-bdee-5a033878925f'
# node.tag='B122' node.identifier='cc4cacfe-023e-11ef-bdee-5a033878925f'
b12_children = tree.children(b12.identifier)
for node in b12_children:
    print(f'{node.tag=} {node.identifier=}')

部分木を取得する

subtree() を使えば部分木を取得できる.

# B01
# ├── B11
# └── B12
#     ├── B121
#     └── B122
subtree_b01 = tree.subtree(b01.identifier)
print(subtree_b01.show(stdout=False))

ノードを削除する

remove_node() を使えばツリー構造からノードを削除できる.

# root
# ├── A01
# │   └── A11
# └── B01
#     ├── B11
#     └── B12
#         ├── B121
#         └── B122
tree.remove_node(c01.identifier)
print(tree.show(stdout=False))

関連記事

tree.nathanfriend.io を使うと「tree コマンド風の」ディレクトリ構造をウェブサイトで簡単に生成できて便利❗️

kakakakakku.hatenablog.com

「Terraform の教科書 - Forkwell Library #51」で Q&A セッションのモデレーターを担当した

2024年5月9日に開催されたオンラインイベント「Terraform の教科書 - Forkwell Library #51」で Q&A セッションのモデレーター(司会者)を担当させて頂いたので,イベント開催前の準備などを簡単にまとめておこうと思う \( 'ω')/

今回は貴重な機会を頂きましてありがとうございました❗️そしてお疲れさまでした〜

forkwell.connpass.com

イベント準備 🎤

2024年4月24日(イベントの2週間前頃)にモデレーターのお話を頂き,正直僕で良いのかな〜と少し悩んだけど,せっかくの機会なので担当させて頂くことにした❗️イベント内容を確認したところ,2024年3月21日に出版された「Terraform の教科書」を翻訳されたねこやまさん @noriko_ro が基調講演をされるとのことで,すぐに「Terraform の教科書」を読み始めて,本書の特徴・読者層などを整理しつつ,書評記事も書いたりした📝

kakakakakku.hatenablog.com

そして,本書はどちらかと言うと Terraform 初学者をターゲットにした一冊だったため,これから Terraform に入門する初学者の気持ちになって「どういうところに疑問を持つか」を考えながら「想定質問集」を作ったりしていた.そもそも僕自身も Terraform を本格的に使い始めたのは2023年5月(ちょうど1年前📅)で,1年前に僕自身がどういう疑問を持っていたかを思い出すのも役に立った.また友人にも Terraform を学び始めるときに悩んだことなどをヒアリングして,客観的な視点も意識した👀

イベント当日 🎤

イベント当日のアーカイブ動画は YouTube に公開されてるので観てもらえればと❗️ねこやまさんの基調講演はとてもわかりやすくて良かった〜👏

そして,Q&A セッションでピックアップした質問(シンプルに書き直している)はザッと以下のような感じ💡ちなみに本書の読者層に沿って初学者の質問を多く拾おうと思っていたけど,実際に投稿して頂いた質問の多くが実践的な質問で少し焦ったけど,アドリブと瞬発力でねこやまさんと一緒に答えられたかな〜と思う.

  • Terraform Cloud (HCP Terraform) を使うメリットは何?
  • AWS Provider と Google Cloud Provider の共通点・差異はある?
  • ディレクトリ構成のおすすめ・tfstate 分割単位のおすすめはある?
  • Terraform Modules は使うべき?使わないべき?
  • Terraform 管理外のリソースが多くあるプロジェクトを Terraform 化する戦略はある?
  • 逆に IaC (Infrastructure as Code) をせずコンソール管理をするべきリソースはある?
  • 例外的にコンソールでリソースを変更する場面はある?
  • Terraform と他の IaC ソリューションを比較して Terraform が苦手なことはある?
  • HashiCorp Certified: Terraform Associate に合格するコツはある?
  • AWS のリソース管理に AWS CloudFormation ではなく Terraform を使うメリットはある?
  • Terraform の開発に役立つおすすめツールはある?
  • Terraform・Provider のバージョンアップ戦略はどうすれば?
  • etc

他にも多く質問があったけど時間の関係で拾えなくてゴメンナサイ🙏 多くの質問・X ポストありがとうございました〜 \( 'ω')/

www.youtube.com

関連記事

kakakakakku.hatenablog.com

Amazon Rekognition / Amazon Lookout for Vision などを試しながら学べる「AWS コンピュータービジョン開発の教科書」を読んだ

2024年3月19日に出版された「AWS コンピュータービジョン開発の教科書」を読んだ📕

コンピュータビジョンは今取り組んでいる仕事にも関連していて,本書の目次を見たら今まで試したことがなかったようなサービスも学べそうだったので,実は出版前から興味を持っていた💡今回は本書を読むだけではなく,気になったトピックを実際に試しながら進めた.

本書では AWS サービスを活用してコンピュータビジョンシステム(用語の定義は以下の what-is サイトを参照)を構築する方法を学べる🤖 とは言え AWS サービスもいくつかあって,まずは本書の目次を見てみるのが1番良いと思う.具体的なサービスと機能だと Amazon Rekognition / Amazon Rekognition Custom Labels / Amazon Lookout for Vision / Amazon SageMaker / Amazon SageMaker Ground Truth / AWS IoT Greengrass などを中心に学べる.これらのサービスをあまり試したことがなかったり,目次を見て興味を持ったら本書の読者層だと思う❗️

aws.amazon.com

目次

  • Part 1: AWS と Amazon Rekognition でのコンピュータービジョンの紹介
    • 1章: コンピュータービジョン・アプリケーションと AWS の AI・機械学習サービスの概要
    • 2章: Amazon Rekognition の利用
    • 3章: Amazon Rekognition Custom Labels を使用したカスタムモデルの作成
  • Part 2: 実世界のユースケースへのコンピュータービジョンの適用
    • 4章: 本人確認を使用した非接触型ホテルチェックインシステムの構築
    • 5章: 動画解析パイプラインの自動化
    • 6章: AWS AI サービスによるコンテンツの検閲
  • Part 3: エッジでのコンピュータービジョン
    • 7章: Amazon Lookout for Vision の紹介
    • 8章: エッジでのコンピュータービジョンを使用した製造不良の検出
  • Part 4: Amazon SageMaker を使用したコンピュータービジョン・ソリューションの構築
    • 9章: Amazon SageMaker Ground Truth を使用したデータのラベル付け
    • 10章: コンピュータービジョンでの Amazon SageMaker の使用
  • Part 5: コンピュータービジョン・アプリケーションの運用環境ワークロードのベストプラクティス
    • 11章: Amazon Augmented AI (A2I) によるヒューマン・イン・ザ・ループの統合
    • 12章: エンドツーエンドのコンピュータービジョン・パイプライン設計のベストプラクティス
    • 13章: コンピュータービジョンへの AI ガバナンスの適用

PDF で読むなら「マイナビブックス」で購入できる👌

book.mynavi.jp

Amazon Rekognition Custom Labels

3章では Amazon Rekognition Custom Labels を使ってデータセットに対して出版社ロゴの Packt にバウンディングボックスを付けて,トレーニングしたモデルをデプロイする流れを体験できる.Amazon Rekognition Custom Labels 自体は過去に使ったことがあるけど,改めてやってみた❗️今回はデータセットが10枚だから簡単だけど多いと大変な作業だな〜と思ったりもした(ワークフォースに関しては9章につながる).

Amazon Rekognition Custom Labels

Amazon Rekognition を活用したチェックインシステム

4章に出てくるチェックインシステムでは,Amazon Rekognition のコレクションDetectFaces API や Amazon Textract の AnalyzeID API などの機能を組み合わせてソリューションが実現されていて参考になった.最終的には aws-samples に公開されている Amazon Rekognition Identity Verification (RIV) ソリューションにつながっていて,本書を読まなくても試せるようになっていた.

github.com

ちなみに4章を読んでるときに Auto Check-In App ソリューションにも少し似てるな〜なんて思ったりもしていた💡

aws.amazon.com

Amazon Lookout for Vision

7章では Amazon Lookout for Vision を使って錠剤に欠陥があるかを検査する仕組みを構築した💊 実は今まで Amazon Lookout for Vision を使ったことがなくて,流れを体験できたのはとても良かった👌流れとしては GitHub に公開されているデータセットを使ってモデルをトレーニングして,トライアル検出タスクを使ってモデルを評価した.そして最後はデプロイしたモデルに対して別の画像を検査して,結果的に 93.74% の信頼度を得ることができた \( 'ω')/

$ aws lookoutvision detect-anomalies \
  --project-name pills-damage-detection \
  --model-version 1 \
  --content-type image/png \
  --body 07_LookoutForVision/images/anomaly/pic.6.615.0.png \
  --region us-east-2
{
    "DetectAnomalyResult": {
        "Source": {
            "Type": "direct"
        },
        "IsAnomalous": true,
        "Confidence": 0.9374997019767761
    }
}

Amazon Lookout for Vision: トライアル検出タスク

読書メモ

他に読書メモに残したことの一部を箇条書きにしておく❗️

本書のサンプルコード・データセットは以下で確認できる.

github.com

誤植

読みながら気付いたところをまとめておく📝(サポートサイトに未掲載のもののみ)

  • P.23: m1.t3.mediumml.t3.medium
  • P.40: recognition =rekognition =
  • P.41: GraphzivGraphviz
  • P.89: 実際に実行すると CreationTimestamp のフォーマットが異なる!?
  • P.165: for record in event['Records']: の改行漏れ
  • P.193: 図7.14 で trailtrial
  • P.210: 説明は EC2 Instance Connect だけど図8.9 は AWS Systems Manager Session Manager になっている
  • P.228: インポートする築インポートする

book.mynavi.jp

関連情報

Amazon SageMaker の機能や MLOps などワークフローまわりを深く学ぶのであれば「実践 AWS データサイエンス」に詳しく書かれていておすすめ❗️僕は2022年にこの本を読んで(書評記事は書いていないけど...)Amazon SageMaker の理解度がグッと高まったな〜と感じた.

また画像分類という領域だと,最近 AWS Prescriptive Guidance に「Image classification solutions on AWS」というドキュメントが追加されていたりする.技術的な選択肢やベストプラクティスは AWS Prescriptive GuidanceAWS Well-Architected Framework Machine Learning Lens などをあわせて読むと良さそう👌

docs.aws.amazon.com

docs.aws.amazon.com