😄

[Terraform]: TerraformでAWSとGithub間のOIDCを作成するメモ

に公開

[Terraform]: TerraformでAWSとGithub間のOIDCを作成するメモ

前回の記事の内容をTerraformで構築するメモ

IDプロバイダーの作成

記事の1.IDプロバイダーの作成の部分

各オプション

url

  • プロバイダのURL

client_id_list

  • OpenID Connectプロバイダーに登録されているアプリケーションを識別する値
resource "aws_iam_openid_connect_provider" "oidc" {
  url            = "https://token.actions.githubusercontent.com"
  client_id_list = ["sts.amazonaws.com"]
}

またエンドポイント検証のサムプリントは自動で取得して設定されるので指定しなくて良いらしい

ロールの作成

記事の下記部分

各オプション

name

  • ロール名

description

  • ロールの説明文章

assume_role_policy

  • 権限をロールに付与するポリシー
  • jsonencodeを使用するとtf言語をそのままjsonに変換してくれるから楽

aud(audience)

  • クレームは誰に向けて発行されたかを示す
  • AWS STSが対象

sub(subject)

  • クレームは誰がこのトークンを要求したかを識別する
  • リポジトリや特定のブランチを指定する

pull_requestを指定すると例えばdevからmainブランチにプルリクエストを発行した時などで実行される。

GitHub Actionsで使用するときに認証エラーで結構苦労した( ´∀` )

resource "aws_iam_role" "oidc_role" {
  name = "AWSOIDCRoleForGithub"
  description = "test"
  path = "/"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Principal = {
        Federated = aws_iam_openid_connect_provider.oidc.arn
      }
      Action = "sts:AssumeRoleWithWebIdentity"
      Condition = {
        StringEquals = {
          "token.actions.githubusercontent.com:aud" : "sts.amazonaws.com"
        }
        StringLike = {
          "token.actions.githubusercontent.com:sub" : "repo:${var.github_org}/${var.github_repository}:pull_request"
        }
      }
    }]
  })
}

また条件が複数個あるとし、どれか1つが一致する場合適用されるには下記のようなForAnyValueを使用する。

"ForAnyValue:StringLike" = {
  "token.actions.githubusercontent.com:sub" : [
    "repo:${var.github_org}/${var.github_repository}:main",
    条件2,
    条件3
  ]
}

ロールにポリシーをアタッチ

記事の3.許可ポリシーを追加の部分

resource "aws_iam_role_policy_attachment" "tmp" {
  role       = aws_iam_role.oidc_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
}

コピー用全文

resource "aws_iam_openid_connect_provider" "oidc" {
  url            = "https://token.actions.githubusercontent.com"
  client_id_list = ["sts.amazonaws.com"]
}

resource "aws_iam_role" "oidc_role" {
  name = "AWSOIDCRoleForGithub"
  description = "test"
  path = "/"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Principal = {
        Federated = aws_iam_openid_connect_provider.oidc.arn
      }
      Action = "sts:AssumeRoleWithWebIdentity"
      Condition = {
        StringEquals = {
          "token.actions.githubusercontent.com:aud" : "sts.amazonaws.com"
        }
        StringLike = {
          "token.actions.githubusercontent.com:sub" : "repo:${var.github_org}/${var.github_repository}:pull_request"
        }
      }
    }]
  })
}

resource "aws_iam_role_policy_attachment" "tmp" {
  role       = aws_iam_role.oidc_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
}

最後に

間違っていることがあれば、コメントに書いていただけると幸いです。
よろしくお願いいたします。

GitHubで編集を提案

Discussion