🤼

AWS BatchをFargateで起動する際のIAMロール付与

2022/10/06に公開

この記事の概要

intro

定期的にシェルスクリプトを実行したい要件があり
AWS Batchを使うべく検証していたところ
AWS公式ブログからFetch & Runなるユースケースを発見しました。
https://aws.amazon.com/jp/blogs/compute/creating-a-simple-fetch-and-run-aws-batch-job/
これはs3バケットからECSコンテナがシェルスクリプトをダウンロード → 実行する
という一連の流れをaws batchで実行できるものです。

fetch and runをFargateで起動すると

先程示したfetch and run通りにリソースを作成しても
AWS BatchのコンピューティングリソースとしてFargate[1]を選択した場合
Unable to locate credentialsエラーが発生してしまい、S3に接続できませんでした。

Unable to locate credentials の解消

Unable to locate credentialsのエラーはecsコンテナにIAMロールが付与できていないことにより発生しています。
解消するためには、ECSタスクロールとしてIAMロールのarnを定義する必要があります。
しかし、AWS Batchのコンソールにタスクロールに該当しそうな項目はありません。

実行ロール の欄ではない。

AWS Batch > ジョブ定義 > プラットフォーム互換性を見ると
実行ロールなるものがありますが、これだけでは解消しませんでした。
これはECSタスクロールに該当しないようです。

この項目はFargateリソースに付与されるIAMではない。

正解は ジョブロール設定

ではどこの項目に指定すればよいかというと
AWS Batch > ジョブ定義 > ジョブ設定 > ジョブロール設定 です。
ここで指定されたIAMロールがリソースに付与されるようです。

fetch and run(Fargate)に必要なロールとポリシー

今回はfetch and runをFargateで実行するために必要だったものをメモがてら記します。

実行ロール

AWS BatchからECSを呼ぶために必要なもの。

信頼エンティティ

ECSからの実行ができればOKです。

コード(クリックして開く)
ecs-tasks
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "ecs-tasks.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

許可ポリシー

AWSマネージドのAmazonECSTaskExecutionRolePolicyがあればOKです。

arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

ジョブロール

信頼エンティティ

実行ロールと同じくECSからの実行ができればOKです。

許可ポリシー

  • AmazonS3ReadOnlyAccess
    S3からシェルスクリプトをダウンロードするために必要
  • AmazonECSTaskExecutionRolePolicy
    FargateでECSを実行するために必要
  • 操作したいリソースに対しての許可ポリシー

outro

fetch and runですが、使い勝手がよく
インスタンスに依存しない処理を置き換えするにはうってつけだと感じました。
公式がこういったユースケースを用意してくれると、レビューを通す上でも話しやすいですね。

脚注
  1. https://aws.amazon.com/jp/fargate/ ↩︎

Discussion