AWS Developer Theory In Action
แนะนําให้อ่านบทความนี้หลังจากอ่านบทความนี้ก่อนที่จะรวมเรื่องของ AWS Developer Theory ว่ามีอะไรบ้างโดยหลักๆคือ 4 ตัวนี้ (เป็นเหมือนภาพรวมทั้งหมดของ Developer tools ใน AWS)
- CodeCommit
- CodeBuild
- CodeDeploy
- Codepipeline
แล้วในบทความนี้เราจะมาลองเล่นกันตั้งแต่ต้นเลย เพื่อที่จะช่วยให้เข้าใจการทํางานมันแบบเข้าใจง่ายๆเลย
CodeCommit
ตัวนี้เข้าใจง่ายสุดละ CodeCommit ก็คือ Git Repository นั้นเอง
ส่วนวิธีสร้างก็แสนง่ายมากๆ คือแค่สร้าง Resource ใน CloudFormation ชื่อ Repository แล้วเราสามารถระบุ Code ตั้งต้นได้อีกด้วย เช่นตัวอย่างในรูป
ตัวอย่างการใช้งาน CodeCommit
File: https://hta-cloudformation-bucket.s3.amazonaws.com/DeveloperTheory/simple-repository.yaml

ตัวอย่างในรูปคือเราใช้ initial code จาก S3 bucket ซึ่งทําให้เราสามารถอ้างอิงไปดึงมาใช้ได้ด้วย เป็นเหมือน code template เวลาให้คนใช้ก็ได้
CodeBuild
CodeBuild ถ้าเปรียบเทียบแบบให้ทุกคนเข้าใจในทันทีก็คือ Jenkins, Travis หรือ CI tools ที่ช่วยทําการ compile, build, package กับ source code ให้เรานั้นเอง
Components หลักๆของ CodeBuild ที่เราต้องเข้าใจ
- การจะใช้ CodeBuild เราต้องสร้างสิ่งนึงเรียกว่า buildspec.yml ซึ่งมันจะเป็นสิ่งที่ทําหน้าที่ในการระบุว่าในแต่ละ stage ของการ build ต้องทําอะไรบ้าง เช่น install, prebuild, post-build เป็นต้น
- Environment เป็นสิ่งที่เราต้อง config ไว้เพื่อที่ให้เราสามารถจะ build code ของเราได้ตามที่เราต้องการ โดยเราต้องระบุหลักๆคือ OS environment, Compute Type ที่จะทําการ build หรือขนาดเครื่องนั้นเอง, แล้วก็ environment image ที่จะใช้ในการ build ว่า environment image นั้นมีอะไรบ้าง
เช่น ถ้าเราจะ build nodejs แต่ environment เราไม่มี Nodejs มันก็จะไม่สามารถ build ได้ใช่มั้ยละ? ที่นี้ในแต่ละ environment ของ AWS ที่เตรียมไว้ให้ก็มีแตกต่างกันออกไป โดยเราสามารถดูทั้งหมดได้จากคําสั่งข้างล่าง หรือ จากหน้าเว็ปก็ได้ เพียงแต่คําสั่งจะ update ล่าสุดมากกว่า
aws codebuild list-curated-environment-images
- Environment ที่ build docker จะแตกต่างกับคนอื่นหน่อยคือ มันต้องมีการตั้ง PrivilegedMode ไว้เพื่อให้สามารถ build docker ได้
ตัวอย่างการใช้งาน CodeBuild
Simple build Cfn File: https://hta-cloudformation-bucket.s3.amazonaws.com/DeveloperTheory/CodeBuild/simple-build.yml
Docker build Cfn File: https://hta-cloudformation-bucket.s3.amazonaws.com/DeveloperTheory/CodeBuild/simple-docker-build.yml

CodeDeploy
เป็น Deployment Service ที่ช่วยให้เราทําการ deploy application ของเราไปที่ Amazon EC2 instances, on-premises instances, serverless Lambda functions, และ Amazon ECS services รวมๆก็คือเกือบหมดเลยนั้นเอง
Components หลักๆของ CodeDeploy มี
- Application
เป็น unique identifies ของ application ที่เราต้องการจะ deploy ซึ่งเจ้า CodeDeploy เนี้ยใช้ชื่อนี้ reference ในระหว่าง deploy เพื่อ identifies นั้นเอง - Deployment Configuration
เป็น rules ต่างๆของ deployment และ condition เมื่อเรา deploy สําเร็จหรือไม่่สําเร็จนั้นเอง ซึ่งเจ้า Configuration นี้ก็จะแตกต่างกันไปในแล้วแต่ Platform ที่เราทําการ deploy เช่น EC2 ก็จะไม่เหมือน Lambda เช่น ถ้าเป็นการ deploy ไปที่ EC2 มันจะมี rule ที่ใช้ Minimum number of health host แต่ถ้า serverless อย่าง Lambda มันจะเป็นเรื่องการ route traffic ในระหว่าง deployment แทน (Canary, Linear, All-at-once) - Deployment Group
เป็นการระบุ instance ที่เราต้องการจะ deploy ลงไปนั้นเอง เช่นเราอาจจะใช้ tag เพื่อ filter กลุ่มของ EC2 ที่เราจะ deploy นั้นเอง - Deployment type
รูปแบบของการ deploy ซึ่งมีหลักๆ 2 แบบคือ In-place, Blue-green deployment รายละเอียดจะแยกหัวข้อให้อีกอัน - Revision
มองง่ายๆคือ version ของ source code — เวลาเรา deploy ไปที่ Lambda มันจะมีการอ้างอิงถึง revision ที่เราใช้ใน YAML configuration เพื่อ specific กับ function เวลาจะ deploy แต่ถ้าเป็น EC2 จะเป็นเรื่องของ archive file ที่มี source content (โค้ดเราหรืออะไรก็ตามที่จะdeploy) และ AppSpec file นั้นเอง
โดย Revision จะถูกจัดเก็บไว้ใน S3 หรือ Github
สรุปแล้วภาพรวมจะออกมาตามรูปด้านล่างนี้



Deployment Type มีกี่ประเภท
โดยเราสามารถแบ่งการ deploy ของมันออกเป็น 2 แบบคือ
- In-place Deployment
เป็นการ deploy แบบที่ application ที่อยู๋บน instance นั้นๆๆจะปิดตัวลงเพื่อลงตัวใหม่ และลง revision ล่าสุด ซึ่งในจังหวะที่ application instance นั้นปิดตัวลงมันก็จะถูกเอาออกจาก Load balancer แล้วค่อยใส่กลับเข้ามาใหม่เมื่อมันลงสําเร็จ (ถ้ามี LB นะ) - Blue/green deployment
เป็น deployment strategy แบบที่คือ deploy ชุดของ application ลงในที่ใดที่นึงก่อน แล้วค่อย switch ไปใช้ทั้งหมดเลยในทีเดียว ทําให้ไม่มีการลด Load capacity ลงระหว่าง deployment (ไม่ปิด Instance ตัวใดตัวนึง)
ตัวอย่างการใช้งาน CodeDeploy กับ EC2 Compute
อย่างที่เราเข้าใจตอนนี้แล้วว่าการ Deploy มีหลากหลายรูปแบบ
ซึ่งเราจะมาดูตัวอย่างที่ deploy ไป EC2 compute กันก่อน เป็นการ Deploy แบบ In-place Deployment ซึ่งเราจะใช้ CloudFormation ทั้งหมดในการ Deploy
แปลว่าเราต้องสร้าง Components ต่างๆที่เราพูดกันรวมถึง EC2 instances ด้วย
Cfn for deploy EC2 compute file: https://hta-cloudformation-bucket.s3.amazonaws.com/DeveloperTheory/CodeDeploy/nodejs-deploy-ec2.yml
การใช้ CodeDeploy รวมกับ EC2 Compute จะมีขั้นตอนเพิ่มในการจัดการบางอย่างก่อน ซึ่งก็คือการ install CodeDeploy Agent ไปบนเครื่อง EC2 นั้นเอง…
ซึ่งการทําแบบนั้นไม่สมควรที่เราจะจัดการแบบ Manual เลย เราเลยต้องพึ่ง tools บางอย่างซึ่งก็คือ CloudFormation::Init และ cfn-init ที่ช่วยจัดการกับ Metadata เพื่อให้เมื่อ EC2 พร้อมทํางานจะมี CodeDeploy agent ทันที

ซึ่งเป็นเทคนิคที่ดีมากเลย แล้วหลังจากนั้นเราแค่ทําการเรียกใช้ใน UserData properties เป็นต้น (เรียกชื่อ Logical นั้นกับ configset)

หลังจากนี้ก็ไม่ใช่เรื่องยากอะไรแล้ว :)
สิ่งที่เราต้องทําก็คือสร้าง resources เหล่านี้กับตั้งค่า Role นิดหน่อยก็เป็นอันเสร็จ
- Application
- DeploymentConfig
- DeploymentGroup
เรามาเลือก EC2 ที่จะ deploy ด้วย Ec2TagFilters
CodeDeploy Log
เราสามารถดู Log ของ Agent ที่ทํางานบน instance ได้ที่ location นี้
/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log
หรือเราจะตั้งค่าให้มันไปเก็บ log ไว้ใน CloudWatch ก็ได้
ตัวอย่างการใช้งาน CodeDeploy กับ ECS Compute
การใช้งาน CodeDeploy กับ ECS มี 2 แบบที่เราต้องรู้ไว้ก่อนที่จะเริ่มใช้งานคือ
- Standard Blue/Green Deployments
- Blue/Green Deployments ผ่าน CloudFormation
ทั้งสองตัวจะมีความแตกต่างที่ชัดเจนคือ เมื่อเราทําผ่าน Cfn มันจะไม่มีการสร้าง
- Application specific name
- Deployment group
- และก็ไม่มี AppSpec ด้วย มัน manage ด้วย hook ตัวนึงที่ชื่อว่า AWS::CodeDeploy::BlueGreen
- ถึงแม้มันจะไม่มีพวก Deployment Group หรือ Application specific name แต่เรายังสามารถ Monitoring ด้วย CodeDeploy ได้เหมือนเดิม โดยเข้าไปใน Deployments แล้วดู history มันจะมี process การทํางานของมันขึ้นโชว์ให้ดูอยู่ว่าทํางานถึงไหนแล้ว
Blue/Green Deployments ผ่าน CloudFormation
จุดหลักของการ Manage ด้วย CLoudFormation ชื่อเราต้อง
- Transform ให้กลายเป็น CodeDeployBlueGreen
- Hook event ที่สร้าง 2 sets ของ ECS — TaskDefinitions, TaskSets และ Traffic Routing (Application Load Balancer)
- โดยใน Template เราจะมีแค่ current application (Blue) ใน ECS แล้วเมื่อเราทําการ update มันจะค่อยๆไปตาม Life Cycle และ switch ตัว update ใหม่เป็น Green แล้วก็ลบตัวปัจจุบันออกไป (ซึ่งหมายความว่าใน template ที่เราทําการ update ก็จะเป็นตัวปัจจุบันบน Prod หรือ Blue นั้นเอง เมื่อเสร็จสิ้นกระบวนกานทั้งหมด แล้วก็วนไปยังงี้)
- ALB minimum สุดๆที่เราจะใช้ประกอบด้วย 1 ALB/NLB,1 Listener, 2 Target Group โดยเรียงลําดับตาม Hook ข้างล่างเลย
หรือดู Syntax ของการ Hook ทั้งหมดด้านล่างนี้ได้เลย

อาจจะค้นหาในเนตไม่ค่อยเจอตัวอย่างเท่าไร เพราะว่า CLoudFormation มันเริ่ม Support ไม่นานก่อนเขียนบทความนี้เอง
ตัวอย่างการใช้งาน CodeDeploy กับ Lambda Compute
เราเคยใช้งาน Lambda กันในบทความก่อนๆแล้ว
ทีนี้พอนํามาใช้คู่กับ CodeDeploy อยากให้แนะนําใช้ SAM ในการจัดการ เพราะมันช่วยให้ชีวิตง่ายขึ้นมากๆๆ เพราะว่าเราไม่ต้องเขียน Appspec อะไรให้วุ่นวาย เราใช้ Hook ใน template ของ SAM ได้เลย รวมถึงใช้คําสั่งพื้นฐานพวก package, deploy ของ SAM ได้อีกด้วย
ลองเล่นได้จาก CloudFormation ข้างล่างนี้เลย
File: https://hta-cloudformation-bucket.s3.amazonaws.com/DeveloperTheory/CodeDeploy/SAM/template.yml
แต่ตัวนี้อาจจะต้องใช้ความรู้เพิ่มนิดหน่อย เลยทํา README ไว้ให้ละ

CodePipeline
มาถึงตัวสุดท้ายกันละ เจ้า CodePipeline ทําหน้าที่เป็นตัวจับแต่ละตัวเข้ามาอยู่ด้วยกันทั้ง CodeCommit, CodeBuild และ CodeDeploy มารวมตัวกันจับมาผูกเข้าด้วยกันนั้นเอง
โดยไม่จําต้องเป็นแค่ต้องใช้ร่วมกับ AWS Service เท่านั้น CodePipeline ยังรวมเข้าไปถึง integrate กับ Third Party ต่างๆๆเช่น Github, Jenkins, CloudBees หรือแม้แต่ TeamCity ด้วย
โดยหลักของ CodePipeline มีสิ่งหลักๆคือเรื่องของการแบ่ง Action Types โดยจะแบ่งออกเป็น
- Source
- Build
- Test
- Deploy
- Approval
- Invoke
ซึ่งแต่ละ Action ก็จะมีความหมายของมันเอง เช่น Source จะมีแค่ตัวเดียวคือ repository ของเรานั้นเอง หรืออย่าง Deploy ก็คือเอาโค้ดของเราไป Deploy ที่ไหนนั้นเอง

โดยแต่ละ Action Type ก็จะมีว่าเราเลือก Provider ไหนได้บ้าง? (มอง Provider เป็นคนที่จะมาจัดการกับแต่ละ Action นั้นๆ)
ซึ่งตัวอย่างที่ทํามาให้ลองเอาไปใช้งานจะมีสองส่วนคือ
- Build a Docker pipeline
https://hta-cloudformation-bucket.s3.amazonaws.com/DeveloperTheory/CodePipeline/docker/simple-build-pipeline.yml - Deploy code to EC2 compute with Github integration
https://hta-cloudformation-bucket.s3.amazonaws.com/DeveloperTheory/CodePipeline/github/simple-integration.yaml
เจ้าตัว docker ไม่ค่อยมัปัญหาหรอก เอาไปใช้กับ CloudFormation ได้เลย แต่ถ้าเป็น Github integration เนี้ยต้องตั้งค่าหลายอย่างหน่อย
- Oauth Token (ตั้งค่าใน Developer settings แล้วสร้างใน Personal access tokens )
- Secret Token (ตั้งค่าระดับ repository สร้าง secret ไว้เพื่อส่งค่า)
- นําเจ้าพวกนี้ไปใส่ใน AWS Secret Manager https://aws.amazon.com/secrets-manager/ เพื่อให้เราสามารถเรียกใช้ได้
วิธีเรียกค่าจาก Secret Manager ใน Cfn
การเรียกใช้งาน Secret Manager มีหลากหลายวิธีแต่ถ้าเราทํางานกับ Cfn เราจะใช้ Dynamic References เพื่อดึงค่ามาใช้ในระดับ Region นะ
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
โดยเจ้า Secret Id เวลาสร้างมันมีหลากหลายมาก

แต่ในเคสเราจะใช้ Other types of secrets สร้าง Json ไฟล์นั้นเอง