業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【Hakkyの社内Wiki】Strapi
クラウドとオンプレの違いAIシステム導入時におすすめのクラウドシステムスクレイピングのためのプロキシサーバのAPI
AI

執筆者:Handbook編集部

Terraformを利用してAWS上でGitHub ActionsのOpenID Connect (OIDC)連携を実装する手順

はじめに

GitHub Actions は、ソフトウェアワークフローを自動化するためのツールです。一方、AWS では OpenID Connect (OIDC) という認証プロトコルをサポートしており、GitHub Actions と統合することで、安全に AWS リソースへのアクセスを制御することが可能になります。この記事では、Terraform を使用して GitHub Actions の OIDC 設定を行う手順を解説します。

OIDC (OpenID Connect) とは?

OpenID Connect(OIDC)は、ユーザーを認証するためのシンプルな ID 層を OAuth 2.0 プロトコルの上に追加するオープンスタンダードです。OAuth 2.0 は、アクセストークンを使用して API へのアクセスを承認するためのプロトコルですが、ユーザーの認証(ID トークンの提供)は含まれていません。この認証のギャップを埋めるために OIDC が開発されました。 OIDC を使用すると、アプリケーションはユーザーを認証し、認証したユーザーに関する基本的なプロファイル情報を取得できます。OIDC は、認証の結果として id_token という名前の JSON Web Token (JWT)を返します。このトークンは、ユーザーの ID、認証時間、その他のユーザーに関する基本情報を含んでいます。

手順の詳細とコードの解説

local.tf で必要な情報を定義

まず locals.tf というファイルを使用して、必要な情報をローカル変数として定義しています。

- locals.tf
locals {
  # GitHubのユーザーネームを設定
  github_username      = "sample_name"
  # GitHubのリポジトリ名を設定
  github_repository    = "sample_repository"
  # GitHubのOIDCエンドポイントのURLを設定
  github_oidc_url      = "https://token.actions.githubusercontent.com"
}

GitHub Actions の OIDC エンドポイントの設定取得

http データソースを使用して、GitHub Actions の OIDC エンドポイントから設定情報を取得します。 OpenID の標準的な設定 URL を使用しています。

// GitHub ActionsのOpenID Connect (OIDC) エンドポイントの設定を取得
data "http" "github_actions_oidc_config" {
  url = "${local.github_oidc_url}/.well-known/openid-configuration"
}

TLS 証明書の情報取得

OIDC エンドポイントの設定情報から、TLS 証明書の URL を取得し、その情報を tls_certificate データソースで取得します。この証明書は、JWT トークンの検証に使用されます。

// GitHub ActionsのOIDCエンドポイントからTLS証明書の情報を取得
data "tls_certificate" "github_actions" {
  url = jsondecode(data.http.github_actions_oidc_config.response_body).jwks_uri
}

GitHub Actions の OIDC エンドポイントを AWS IAM OpenID Connect プロバイダとして登録

# GitHub ActionsのOIDC (OpenID Connect) エンドポイントをAWS IAM OpenID Connectプロバイダとして登録
# thumbprint_listは変更される可能性があるため、固定にしない
resource "aws_iam_openid_connect_provider" "github_actions" {
  url             = local.github_oidc_url
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = [data.tls_certificate.github_actions.certificates[0].sha1_fingerprint]
}

AssumeRoleWithWebIdentity 許可ポリシーの定義

aws_iam_policy_document を使用して、GitHub Actions が Amazon STS の AssumeRoleWithWebIdentity 操作を呼び出す際の許可ポリシーを定義します。このポリシーは、特定の GitHub リポジトリのジョブからのみ AWS リソースにアクセスすることを可能にします。

// GitHub ActionsがAmazon STSでのAssumeRoleWithWebIdentity操作を呼び出す際の許可ポリシーを定義
data "aws_iam_policy_document" "github_actions_assume_role" {

  statement {

    # アクションが許可される効果
    effect  = "Allow"

    # 許可されるアクションのリスト。ここではWeb IDを用いてのロールの取得を許可しています。
    actions = ["sts:AssumeRoleWithWebIdentity"]

    principals {
      # どのようなエンティティがこのポリシーのステートメントの許可を受けるかを定義します。

      # 連携する外部IDプロバイダ(この場合はGitHub Actions)のタイプを指定
      type        = "Federated"

      # 許可するエンティティのARN。この場合はGitHub ActionsのOIDCプロバイダのARNを指定
      identifiers = [aws_iam_openid_connect_provider.github_actions.arn]
    }

    # 以下はポリシーの条件部分

    condition {
      # 認証トークンのaudが期待される値と一致するかをチェックする条件

      # テストの種類を指定。この場合はStringEqualsを使用して文字列の完全一致をテスト
      test     = "StringEquals"

      # テスト対象の変数
      variable = "token.actions.githubusercontent.com:aud"

      # 期待される値
      values   = ["sts.amazonaws.com"]
    }

    condition {
      # 認証トークンのsubが特定のパターンと一致するかをチェックする条件

      # テストの種類を指定。この場合はStringLikeを使用して文字列の部分一致をテスト
      test     = "StringLike"

      # テスト対象の変数
      variable = "token.actions.githubusercontent.com:sub"

      # 期待される値のパターン。特定のGitHubリポジトリに関する情報を含む
      values   = ["repo:${local.github_username}/${local.github_repository}:ref:refs/heads/*"]
    }
  }
}

まとめ

これらの手順を完了すると、GitHub Actions から AWS のリソースに安全にアクセスするための OIDC 設定が完了します。これにより、セキュリティが強化され、アクセス制御も柔軟に行えるようになります。Terraform を使用して GitHub Actions の OIDC を設定することで、GitHub Actions と AWS の統合を強化し、セキュリティとアクセス制御の柔軟性を高めることができます。最初のうちは複雑に感じるかもしれませんが、一度理解すれば非常に強力なツールとして活用することができます。

参考

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年06月13日に最終更新
読み込み中...