-
Create the GitHub OIDC role:
- Create or reuse the GitHub OIDC provider for
https://token.actions.githubusercontent.com. - Create an IAM role whose trust policy allows
repo:<OWNER>/<REPO>:ref:refs/heads/main. - Attach
.github/iam/terraform-prod-policy.jsonas an inline policy.
- Create or reuse the GitHub OIDC provider for
-
Add the printed ARN as the GitHub secret
AWS_GITHUB_OIDC_ROLE_ARN. -
Optional: if you want local
kubectlaccess after deploy, setEKS_CLUSTER_ADMIN_PRINCIPAL_ARNS_JSONto a JSON array containing your administrator IAM user or role ARN. -
Optional: if deploying into an existing EKS cluster, set the variables in existing-cluster.md before planning.
-
Run
Terraform Bootstrapwithaction=apply. -
Run
Terraform Prodwithaction=plan. -
Review the plan.
-
Run
Terraform Prodwithaction=apply.
aws eks update-kubeconfig --name plane-prod-eks --region eu-west-1
kubectl get ingress plane-ingress -n planeUse the ALB hostname unless PLANE_APP_HOST points to it through DNS.
For existing-cluster mode, replace plane-prod-eks with EXISTING_EKS_CLUSTER_NAME.
If your local IAM principal was not added to EKS_CLUSTER_ADMIN_PRINCIPAL_ARNS_JSON, get the ALB DNS name from AWS instead:
aws elbv2 describe-load-balancers --region eu-west-1 \
--query "LoadBalancers[?contains(LoadBalancerName, 'k8s-plane')].DNSName" \
--output textRun Terraform Prod with action=plan, review the plan, then run action=apply.
Changing service modes can add or remove managed resources. Review plan output carefully before applying.
- Missing
AWS_GITHUB_OIDC_ROLE_ARN: configure the repository secret with the IAM role ARN after creating the GitHub OIDC role. Not authorized to perform sts:AssumeRoleWithWebIdentity: make sure the OIDC trust policy allowsrepo:<owner>/<repo>:ref:refs/heads/mainand that you ran the workflow frommain.- Backend bucket missing: run
Terraform Bootstrapwithaction=apply. - EKS API not reachable from GitHub-hosted runners: keep public endpoint enabled or run Actions on a network that can reach the private endpoint.
- Existing cluster variables missing: set
EXISTING_EKS_CLUSTER_NAME, and set the existing VPC/subnet variables if any data service remains AWS-managed. - AWS quota errors: check NAT Gateway, Elastic IP, EKS, RDS, Amazon MQ, ElastiCache, and instance-type availability in the selected region.
- External mode missing secret: check service-modes.md for the required GitHub secrets.
There is no destructive workflow by default. Run terraform destroy manually from a trusted workstation after configuring the same backend and variables used by the workflows.