😄
[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"
}
最後に
間違っていることがあれば、コメントに書いていただけると幸いです。
よろしくお願いいたします。
Discussion