Skip to main content

AWS

Use this guide when you want to add the AWS IAM side to an existing Terraform stack.

Module split​

The repo ships two modules:

  • aws_oidc_provider for the account-level IAM OIDC provider
  • aws_oidc_role for workload roles trusted by that provider

This split matters because the provider URL is unique per AWS account. Most consumers should create the provider once and reuse it for many roles.

One-time provider setup​

module "bridge_provider" {
source = "github.com/meigma/k8s-aws-oidc//terraform/modules/aws_oidc_provider"

issuer_url = "https://oidc.example.tailnet.ts.net"
}

Workload role setup​

module "demo_role" {
source = "github.com/meigma/k8s-aws-oidc//terraform/modules/aws_oidc_role"

role_name = "demo-app-role"
oidc_provider_arn = module.bridge_provider.arn
issuer_host = module.bridge_provider.issuer_host

service_account_subjects = [
"system:serviceaccount:demo:demo-app",
]
}

Subject and audience rules​

The role trust expects exact matches on:

  • ${issuer_host}:aud
  • ${issuer_host}:sub

The default audience is sts.amazonaws.com.

Subjects must be fully qualified:

system:serviceaccount:<namespace>:<service-account>

Attaching permissions​

The role module supports:

  • managed_policy_arns
  • inline_policy_json

If your organization already has a policy attachment pattern, you can leave the role module focused on the trust policy and attach permissions elsewhere.