Dùng OIDC federation: GitHub Actions phát hành một OIDC token ngắn hạn cho mỗi lần chạy job, AWS tin nhà phát hành đó và đổi token lấy credential tạm qua sts:AssumeRoleWithWebIdentity. Không có access key nào nằm trong repo secrets.
Các bước:
1. Tạo IAM OIDC identity provider trỏ tới nhà phát hành của GitHub Actions.
2. Tạo IAM role với trust policy chỉ chấp nhận token từ provider đó, và có Condition khoá đúng repo/branch qua claim sub.
3. Gắn permission policy hẹp (chỉ deploy được đúng service cần) cho role.
4. Trong workflow, xin quyền id-token: write rồi assume role, lấy credential tạm.
permissions:
id-token: write
contents: readChi tiết dễ sai và hay bị hỏi lại: nếu trust policy chỉ kiểm tra audience mà không khoá sub, thì bất kỳ repo GitHub nào cũng assume được role của bạn. Phải ràng buộc dạng repo:<org>/<repo>:ref:refs/heads/main (hoặc environment:production) để chỉ nhánh/environment được duyệt mới deploy được.
So với access key lưu trong secrets: credential ở đây hết hạn sau vài giờ, không cần xoay vòng thủ công, và mỗi lần assume đều để lại vết trong CloudTrail kèm thông tin repo/run.