Github Action ติดต่อกับ AWS แบบไม่ต้องใช้ IAM Access Key

Pao Payungsak Klinchampa
PAOCLOUD CO., LTD.
Published in
2 min readJun 30, 2022

--

ปัญหาเรื่องของการจัดการ Access Key , API Key , Token หรือจะเรียกอะไรก็เเล้วเเต่เถอะ 555 ยังคงเป็นปัญหามาจนถึงทุกวันนี้ ว่าเราจะจัดการยังไง ถ้าเผลอทำหลุดก็ต้องตามไป Revoke Key ทิ้ง ล้ะต้องตรวจสอบ Effect ความเสียหายต่างๆอีก วุ่นวายมากๆ

ดังนั้นทางออกที่ดีคือ ไม่ต้องสร้าง Access Key ให้วุ่นวายครับ 555555555555555

ต้องขอบคุณ Github Action ที่รองรับสิ่งที่เราเรียกว่า OIDC ครับ เราเลยทำอะไรแบบนี้ได้

ส่วนการใช้งานนั้น ก็ตามด้านล่างนี้ครับ

สร้าง Identities Provider ขึ้นมาก่อน เราอยากให้ Github Action เข้ามาได้ เราก็ต้อง Add Provider ของ Github Action ครับ ซึ่งใช้ค่านี้ Add ลงไป

URL : https://token.actions.githubusercontent.com

Type : OpenID Connect

Audiences: sts.amazonaws.com

กรณีของผมคือเปิดให้ Github Action เข้าถึง AWS ECR ได้ โดยมันจะ Build app เป็น Container Image ล้ะ Push ขึ้น AWS ECR ครับ โดยเราต้องสร้าง IAM Policy หน้าตาประมาณนี้

ในตัวอย่างเขียนสั้นๆ เลยเปิดเป็น ecr:* นะครับ คือทำอะไรก็ตามกับ ECR ได้ทุกอย่าง จะกำหนด Policy ให้รัดกุมมากกว่านี้ก็ได้ตามเเต่จะต้องการ

จากนั้นก็สร้าง Role ขึ้นมา เลือก Type เป็น Web Indentities เลือก Audience เป็น sts.amazonaws.com จากนั้นก็ใส่ Policy ข้างบนที่สร้างเอาไว้ ตั้งชื่อ เสร็จครับ

ขั้นตอนสุดท้ายฝั่ง AWS เราต้องกำหนดค่า Trust Relationship ของ Role กันก่อน ว่าจะ Accept Github จาก Account ชื่ออะไร Repo ชื่ออะไร ตามตัวอย่างแบบนี้ครับ

ตรง Federated Principal เราก็เอา ARN ของ Identities Provider ที่เราสร้างขึ้นมาใส่ลงไป

ในส่วนของ Action จะมีการกำหนด Condition เพิ่มเติม ตรง repo:paocloud/* หมายถึงยอมรับทุกๆ Repo ที่มาจาก User/Organization ชื่อ paocloud ครับ ตรงเครื่องหมาย * คือทุกๆ Repo สามารถใช้งาน Role นี้ได้

แค่นี้ก็เรียบร้อยครับบนฝั่ง AWS ต่อไปก็มาตั้งค่าใน yml file ของ Github Action กันต่อครับ ตามนี้

ในส่วนของ job build ให้เรากำหนด permission ตามภาพเลยครับ และส่วนของ Configure AWS Credentials ก็ให้ระบุ Region, Role ARN ส่วนค่า Role Session Name เป็นอะไรก็ได้ จะตั้งชื่อตามผมก็ได้นะ

จากนั้นก็เรียกใช้ aws action ชื่อ amazon-ecr-login เพื่อให้ Log in ไปยัง AWS ECR ครับ ตรงนี้คือประมาณว่า เรา Authen ด้วย OIDC Role เเล้วเนี่ย เราจะได้ Key มาอันนึง ล้ะเราก็เอา Key นี้ไป Authen กับ AWS ECR เพื่อให้ได้ Key อีกชุดในการ Push Image ขึ้น AWS ECR ครับ

แล้วก็เรียกใช้ docker build , docker push ตามปกติ ส่วน pwd , ls -la อันนี้ผมใส่ไว้ ตรวจสอบ File Code เฉยๆ เพื่อช่วยในการ Debug ต่างๆ 5555 ไม่เกี่ยวกับ Blog นี้หรอกนะ

ผมใส่คำสั่ง aws sts get-caller-identity เอาไว้ด้วย เพื่อเป็นการ Prove ว่า OIDC Role ที่เรากำหนดเนี่ย เอาไป Login ได้แล้ว ซึ่งถ้าได้ จะมีค่า Return กลับมาครับว่าเป็น username อะไร

ใครติดตรงไหนก็ Inbox ถามกันเข้ามาได้นะครับ แล้วพบกันใหม่ใน Blog ต่อไป

--

--