Closed7

GitHub Actions で AWS の OIDC Provider 経由で認証する

snakasnaka

https://github.com/aws-actions/configure-aws-credentials/issues/271#issuecomment-931012696

のコメントにあったように job に permissions を追加したら解消した

jobs:
  hoge:
    permissions:
      id-token: write
      contents: read

よく見たら README の example にもしれっと記載があった

jobs:
  deploy:
    name: Upload to Amazon S3
    runs-on: ubuntu-latest
    # These permissions are needed to interact with GitHub's OIDC Token endpoint.
    permissions:
      id-token: write
      contents: read
snakasnaka

aws-actions/amazon-ecs-deploy-task-definition@v1 で エラーとなる

エラーメッセージ

Error: Failed to register task definition in ECS: User: arn:aws:sts::***:assumed-role/{oidc role name}/GitHubActions is not authorized to perform: iam:PassRole on resource: arn:aws:iam::***:role/{task role} because no identity-based policy allows the iam:PassRole action

原因

Policy による AssumeRole を許可するロールのARNを記述する際に {task role} に指定するべきロールが、誤ってスケジュールタスク用のロールを指定していたため。
また、その後タスクロールに加えてタスク実行ロールも必要であることが判明した。

対応

Policy を修正本来のタスクロールに変更するのと同時にタスク実行ロールを追加した。

        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::{aws account id}:role/{task role}",
                "arn:aws:iam::{aws account id}:role/{task execution role}"
            ]
        }

参考

タスクロールとタスク実行ロールがいつもわからなくなるので、以下は参考ページ。

ECSのタスクロールとタスク実行ロールの違い - karakaram-blog

snakasnaka

必要なパーミッションの確認

workflow から利用している Action から必要そうな Permission を洗い出してみる

aws-actions/amazon-ecs-render-task-definition@v1

https://github.com/aws-actions/amazon-ecs-render-task-definition

index.js 見る限り AWS API は利用してなさそう

aws-actions/amazon-ecs-deploy-task-definition@v1

README に記載がある

Permissions

aws-actions/amazon-ecr-login@v1

こちらも README に記載がある

Permissions

Songmu/ecschedule@main

json
{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "events:PutTargets",
          "ecs:RunTask",
          "events:PutRule",
          "events:ListTargetsByRule"
        ],
        "Resource": [
          "arn:aws:ecs:ap-northeast-1:${local.account}:task-definition/*:*",
          "arn:aws:events:*:${local.account}:rule/*"
        ]
      },
      {
        "Effect": "Allow",
        "Action": [
          "events:ListRules",
          "ecs:DescribeTaskDefinition"
        ],
        "Resource": "*"
      },
      {
        "Effect": "Allow",
        "Action": "iam:PassRole",
        "Resource": aws_iam_role.ecs_events.arn  // ECS イベントのロール
      }
    ]
  }
snakasnaka

secretsmanager:GetSecretValue を追加した

workflow の中から AWS CLI 経由で SecretsManager の値を参照しているのでその権限を追加した

snakasnaka

必要なパーミッションの確認

workflow から利用している Action から必要そうな Permission を洗い出してみる

aws-actions/amazon-ecs-render-task-definition@v1

https://github.com/aws-actions/amazon-ecs-render-task-definition

index.js 見る限り AWS API は利用してなさそう

aws-actions/amazon-ecs-deploy-task-definition@v1

README に記載がある

Permissions

aws-actions/amazon-ecr-login@v1

こちらも README に記載がある

Permissions

  • login
  • push / pull

記述が分かれているので両方必要なときには注意

Songmu/ecschedule@main

json
{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "events:PutTargets",
          "ecs:RunTask",
          "events:PutRule",
          "events:ListTargetsByRule"
        ],
        "Resource": [
          "arn:aws:ecs:ap-northeast-1:${local.account}:task-definition/*:*",
          "arn:aws:events:*:${local.account}:rule/*"
        ]
      },
      {
        "Effect": "Allow",
        "Action": [
          "events:ListRules",
          "ecs:DescribeTaskDefinition"
        ],
        "Resource": "*"
      },
      {
        "Effect": "Allow",
        "Action": "iam:PassRole",
        "Resource": aws_iam_role.ecs_events.arn  // ECS イベントのロール
      }
    ]
  }
snakasnaka

ECR に login するための権限として ecr:GetAuthorizationToken が必要

Permissions

の push and pull の権限だけ指定してたら、ログインで権限足りないと怒られたので ecr:GetAuthorizationToken も付与するのを忘れずに

このスクラップは2023/11/29にクローズされました