🌟

Secrets Manager と S3 フラグで実現するバッチの前提条件確認

に公開
  1. Step Functions で ECS タスクを起動する(Aws Secrets Manager 連携を含む)
    1. Step Functions と Amazon ECS の統合方法
      https://docs.aws.amazon.com/step-functions/latest/dg/connect-ecs.html
      • ECS タスクを Step Functions から RunTask で同期/非同期に呼び出すためのパラメータや JSON 定義の書き方が詳しく載っています。
      • secrets セクションを使って Secrets Manager のシークレットを直接コンテナに渡す例も紹介されています。
    2. Step Functions のタスク定義における “Retry”/“Catch”(エラー処理)の書き方
      https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html
      • Initialize フェーズで失敗したときに再試行したり、SNS 通知してバッチ全体を止めたい場合の設定例が載っています。

  1. AWS Secrets Manager からシークレットを取得し、コンテナに渡す
    1. Secrets Manager の基本チュートリアル
      https://docs.aws.amazon.com/secretsmanager/latest/userguide/getting-started.html
      • シークレットを作成し、ローテーション設定を行う手順が日本語で解説されています。Initialize で必要な認証情報を保管するにはここをまず参照してください。
    2. Java で Secrets Manager から値を取得するサンプル
      https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_java.html
      • AWS SDK for Java を使って getSecretValue を呼ぶサンプルコードが載っています。WildFly のバッチアプリ内でこのコードを利用すると、EJB メソッド内からそのまま秘密情報を取得できます。
    3. ECS タスク定義の secrets パラメータについて
      https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html
      • タスク定義 JSON/YAML において、Secrets Manager の ARN をどのように secrets というキーで渡すかが記載されています。これを使えばシェルスクリプトで明示的に AWS CLI を呼ばなくても、コンテナ起動時に環境変数としてシークレットが注入されます。

  1. AWS CLI を使って S3 上のフラグファイルをチェックする
    1. AWS CLI:s3api head-object コマンド
      https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html
      • S3 上にフラグファイル(例:open-flag.txt)が存在するかどうかを判定するには、この head-object --bucket … --key … が使えます。リターンコードを見て 404 Not Found ならフラグファイルなしと判断します。
    2. AWS CLI のインストール&設定方法
      https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
      • コンテナ内で AWS CLI を使う場合は、Dockerfile にどうやって AWS CLI をインストールするかの例が載っています。Initialize ステップのシェルスクリプトで aws s3api head-object を呼びたいときに参考になります。

  1. WildFly 上でバッチ処理を実行するパターン
    1. WildFly で起動時に実行するカスタムスタンドアロン・スクリプト
      https://docs.jboss.org/author/display/WFLY10/Command+Line+Interface+Guide
      • WildFly の standalone.sh 起動後に JBoss CLI を経由して特定の EJB メソッドを呼び出したり、バッチロジックを動かす方法が書かれています。
      • EJB の呼び出し例:

/subsystem=deployment/deployment=your-batch-app.war:deploy
/deployment=your-batch-app.war/subsystem=batch:run-batch(name="InitializeBatch")

•	これをコンテナの起動コマンドに組み込めば、Initialize で EJB が自動実行されます。

2.	WildFly のバッチフレームワーク(BatchEE / JBeret)チュートリアル

https://github.com/jberet/jsr352-reference
• JSR-352(Java Batch)が使える環境下でのサンプルですが、WildFly でも JBeret を組み込むことでバッチジョブを容易に定義できます。
• もし複雑なジョブ/ステップ制御が必要な場合、Initialize→Fetch→Process→Upload といった複数ステップのバッチを JSR-352 で書いた上で、WildFly にデプロイしておくと Step Functions からは「コンテナ起動だけ」で済みます。

  1. Step Functions + Secrets Manager + S3 フラグ → 全体パターン(ブログ記事など)
    1. AWS 公式ブログ:Step Functions で Secrets Manager と組み合わせたワークフロー例
      https://aws.amazon.com/jp/blogs/news/automate-secret-rotation-for-aws-lambda-functions-using-step-functions/
      • Lambda 用のシークレットローテーション例ですが、Step Functions で Secrets Manager を呼び出す流れが参考になります。ECS タスクに置き換えて考えてください。
    2. GitHub サンプル:Step Functions + ECS + Secrets Manager 連携サンプルプロジェクト
      https://github.com/aws-samples/aws-step-functions-ecs-secretsmanager-sample
      • 実際に Step Functions で ECS タスクを起動し、Secrets Manager の値をコンテナ内で使う構成が一通りそろっています。Initialize の部分をこのサンプルから流用できます。

まとめ
• 「なぜ Initialize が要るか」
→ 後続の処理を失敗させないために、あらかじめ Secrets Manager から認証情報を取得して環境を整え、S3 フラグファイルの有無をチェックして「バッチを実行すべきか」を判定するためです。
• 参考にするページ
1. Step Functions と ECS の連携方法(ECS タスク起動と secrets パラメータ)
2. AWS Secrets Manager の使い方チュートリアル(Java サンプル含む)
3. AWS CLI で S3 フラグファイルをチェックする方法
4. WildFly 上でバッチを起動するための JBoss CLI リファレンス
5. 実例としての GitHub サンプルや AWS ブログ記事

まずは上記ドキュメントを順番に読んで、「Initialize → Fetch → Process → Upload → Notify」の大まかな流れを自分のサンプルアプリで試してみてください。一度流れをつかめば、そのあと各ステップの EJB 実装やシェルスクリプトがどれだけスムーズに書けるかがわかります。応援しています!

Discussion