GitHub Actions and OIDC
GitHub Actions สามารถ deploy ไป AWS ได้โดยไม่ต้องเก็บ long-lived AWS Access Key ใน repository secrets เมื่อใช้ OpenID Connect และ IAM Role trust policy ที่จำกัดดี
Workflow, jobs และ environments
GitHub Actions workflow คือ YAML ที่กำหนด triggers, jobs และ steps Jobs สามารถผูกกับ environments เช่น dev, staging, production เพื่อเพิ่ม approval, secrets และ protection rules ตาม environment
OIDC กับ AWS
OIDC ให้ workflow ขอ short-lived token แล้ว assume IAM Role ใน AWS ผ่าน trust relationship ข้อดีคือไม่ต้องเก็บ access key แบบถาวร และสามารถจำกัดว่า repo/branch/environment ใด assume role ได้
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::111122223333:role/github-deploy-prod
aws-region: ap-southeast-1
- run: aws sts get-caller-identity
Trust policy conditions
IAM Role ที่ trust GitHub OIDC provider ควรตรวจ audience และ subject claim เช่น organization, repository, branch หรือ environment
ถ้าไม่จำกัด sub ให้ดี repo ที่ไม่ควรเข้าถึง AWS อาจขอ assume role ได้
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:ORG/REPO:environment:production"
}
}
Best practices
- ใช้ OIDC แทน long-lived access keys
- แยก IAM Role ต่อ environment และจำกัด permissions ตามงาน
- ใช้ protected branches และ required reviews สำหรับ production
- ตั้ง concurrency เพื่อกัน deploy production ซ้อนกัน
- อย่า print secrets หรือ Terraform plan ที่มี sensitive values ลง logs
Common mistakes
- Trust policy เปิดกว้างทั้ง organization โดยไม่จำกัด repo/branch/environment
- ใช้ role เดียวสำหรับ dev และ prod ทำให้ blast radius ใหญ่
- ให้ workflow ใช้ pull_request จาก fork deploy หรืออ่าน secrets โดยไม่ตั้ง guardrails
Review questions
- OIDC ช่วยลดความเสี่ยงจาก access key อย่างไร?
- ทำไม trust policy ต้องตรวจ
subclaim? - ควรแยก IAM Role ต่อ environment เพราะอะไร?