Make it easy from converting Java/.Net to Container application
Tags: aws, awsthai, container, app2container
Published: 2021-09-14 10:44:10

สำหรับใครกำลังมองหาวิธีการเอา application ที่ถูกพัฒนาโดยภาษา Java หรือ .Net ขึ้นไปบน Cloud แต่อยากจะเปลี่ยนให้เป็น application ในลักษณะ Container แทน AWS มี solution ที่ชื่อ App2Container มาช่วยตรงนี้ได้

App2Container (A2C) คืออะไร App2Containerเป็นเครื่องมือ หรือ Command line ที่ใช้ในการปรับปรุงแอปพลิเคชัน .NET และ Java ให้เป็นแอปพลิเคชันคอนเทนเนอร์ โดยไม่จำเป็นต้องแก้ code ใดๆ

App2Container เน้นอะไรบ้างและให้ประโยชน์อะไร
1. Portability : ด้วยคุณสมบัติของ Container ทำให้เราสามารถจะ deploy ไปที่ไหนก็ได้ ด้วยตัวของ Container เองจะมีการ pack runtime, deployed code และ libraries ต่างๆ รวมกันทำให้สามารถมีคุณสมบัติ portability

2. Developer Productivity : Container สามารถช่วยในเรื่องการเริ่มต้นพัฒนาที่ง่ายและรวดเร็ว โดยตัดในเรื่องของความซับซ้อนของ Application และการติดตั้ง dependencies ต่างๆลง จึงทำให้ developer ได้มีมุ่งพัฒนา application และทำให้ภาพรวมเกิดความเร็วในการพัฒนา Application

3. IT Infrastructure Reduction : Container สามารถช่วยลดในเรื่องการใช้ resource ที่สูง Container สามารถเริ่มต้นได้ตั้งแต่หลัก MB 

4. Standardization of CI/CD : เมื่อเราพูดถึง CI/CD application ที่มีลักษณะ legacy สามารถทำตรงนี้ได้ และ Container จะเหมาะในการทำ CI/CD ได้ดีกว่า legacy application ปรกติ

แหล่งที่มา https://aws.amazon.com/app2container/faqs/

เริ่มอยากจะเห็นแล้วใช่ไหม ว่าการใช้งาน App2Container เป็นอย่างไร :D
พอดีมีคู่มือดีๆ อยู่ จาก link นี้ https://app2container.workshop.aws/
คราวนี้จะมารีวิวในแต่ละขั้นตอน และสรุปให้ฟังในตอนท้าย

เครื่องมือ
1. AWS CloudFormation
2. AWS Database Migration Service (DMS)
3. AWS App2Container command line
4. AWS Relational Database Service (RDS)
5. AWS Elastic Container Registry
6. AWS Elastic Container Service
7. AWS S3

ขั้นตอนแรก ใน lab เค้าให้กด CloudFormation template ซึ่งจะไป provision resource ต่างๆ ที่ us-west-2 region ซึ่ง CloudFormation Provision อะไรให้เรา CloudFormation จะทำการ deploy VPC, subnet ของฝั่ง Source และ Target รวมไปถึง source ที่เป็นเครื่อง เช่น EC2 ที่มี app และ EC2 ที่มี database อยู่ เพราะเราไม่มี datacenter on premise นะ CloudFormation เลยจำลองให้

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vav9p5zf0qxe8ghya7ni.png)

ถัดมา lab ให้ไปทำ PostgreSQL migration จาก vm เครื่องหนึ่งที่ run ด้วย ubuntu แล้ว migrate ไปเป็น AWS RDS PostgreSQL ซึ่งขั้นตอนนี้ BLOG นี้ไม่ได้เน้นนะ เราเน้นตรงที่ใช้ App2Container ส่วนเครื่องมือที่ใช้ในการ migrate DB ของ AWS คือ AWS DMS ถ้าใครสนใจสามารถเข้าไปทำ lab ใน part นี้ได้จาก link นี้
https://app2container.workshop.aws/en/java-migrate-your-db.html

Output ที่ได้จาก lab part นี้คือ การ migrate DB จากเครื่องVM เครื่องนึง (ซึ่งในที่นี้ จำลองโดยใช้ EC2) ไปยัง AWS RDS จากรูปเป็นการ snapshot มาจาก AWS DMS ซึ่งได้ทำการ Configure Source machine (EC2 - PostgreSQL) และ Target (AWS RDS PostgreSQL) ไว้ จากนั้นกด run task

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2juus9pvskn8r9y4mih6.png)

ทีนี้มาถึง part พระเอกของเราแล้ว นั่นคือ App2Container โดยใน lab ให้เราเข้าไปในเครื่อง Source Web Java เราต้องเข้าไปโดยวิธี Session Manager ต่อมาทำตาม step ข้างล่างเลย

*$ sudo su*
*$ aws configure*
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6p2zttn0if222ctqm11.png)

*$ curl -o AWSApp2Container-installer-linux.tar.gz https://app2container-release-us-east-1.s3.us-east-
1.amazonaws.com/latest/linux/AWSApp2Container-installer-linux.tar.gz*

*$ tar xvf AWSApp2Container-installer-linux.tar.gz*
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6cengxux2895qc7recw8.png)

*$ ./install.sh*
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8liaf6a3x7v7gk9mrgnb.png)

*$ app2container help*
ทดสอบการติดตั้ง app2container command line
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecyyvodvvtehhxx4bt67.png)

ตอนนี้เราได้ลง App2Container ที่เครื่อง Source และ initialize เรียบร้อยแล้ว

*$ app2container inventory*
Run command นี้ เพื่อให้ App2Container ทำการ discovery แล้วก็ list Java application ที่ run อยู่บนเครื่อง VM นี้ออกมา 
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a2gfapm3rd6icszputqo.png)

*$ app2container analyze --application-id <java-app-id>*
Run command นี้เพื่อ analyse Java Application และทำการสร้าง artifact ออกมาที่ folder พร้อม deploy เป็น container
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sjnphnzplgv01fov0j66.png)

*$ app2container containerize --application-id <java-app-id>*
Run command นี้เพื่อ build Java application เป็น docker image
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6uhuwa11aayvpshbtzg1.png)

*$ docker images*
Run command นี้เพื่อ list docker images ออกมาทั้งหมด จะเห็นว่าเรามี java-tomcat-xxxx images ด้วย ที่ถูกสร้างขึ้นมาโดย App2Container 
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d39gq8uojo3kiv838q6o.png)

*$ nano /root/app2container/<java-app-id>/deployment.json*
แก้ไข file deployment.json และแก้ไข value ของ parameter vpcId ซึ่งอยู่ข้างใน reuseResources parameter อีกที โดยเอา VPCTarget id มาแปะ 
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q6j6khikrmtiucolxgn5.png)

*$ app2container generate app-deployment --application-id <java-app-id>*
Push docker image ไปที่ AWS ECR และสร้าง ECS Task
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ihywcxivv1vori5jvltr.png)

ต่อมา เราเข้ามาดูที่ AWS ECR จะมี docker images ถูก push ขึ้นมาโดย App2Container
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgcgc3wwpcdd8msmv9tb.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2sfm3tqe4l30r46sy92a.png)

App2Container จะไปสร้าง task definition ที่ ECS ด้วย
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sznntiu8w1ejl9v5rrob.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38ypmjebxzaj0t0iuyyz.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rnjbizmy5nv5p8i8w0hn.png)

App2Container ได้นำพวก Artifact ต่างๆ ไปเก็บไว้ที่ s3 เช่น yaml file ที่จะถูก Cloudformation นำไป deploy
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ef34hsb7lq99xcj2cws.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5m9dx4xk6h9pewibguf9.png)

*$ aws cloudformation deploy --template-file /root/app2container/<java-app-id>/EcsDeployment/ecs-master.yml --capabilities CAPABILITY_NAMED_IAM --stack-name a2c-<java-app-id>-ECS*
ต่อมา Run command ในการ deploy yaml file ที่ CloudFormation service

หลังจาก deploy stack เสร็จเรียบร้อย จะมีหน้าตาตามรูปข้างล่าง
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/urst7ur38ks7s2suqotu.png)

ไปตรวจที่ AWS ECS กันว่ามีการสร้าง Cluster ขึ้นมารึเปล่า
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gz9uqezdofedlhnftkc0.png)

กดไปที่ link target group หลังจากนั้นให้เรา copy load balance DNS name มา
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26x1v8ozcehf80f63pfz.png)

ทดสอบ load balancer DNS name ที่เรา copy มาจาก ECS
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cd5v2mhjhlg9yh6w3351.png)

เย้!!! ในที่สุดก็ได้ webpage สวยงามมา ซึ่งได้มาจากผลงาน App2Container

!!!บทสรุปของ BLOG นี้คืออะไร!!!
เราค้นพบว่า App2Container สามารถช่วยทำให้เราเปลี่ยนจาก Java (หรือ .NET) ไปเป็นในรูปแบบ Container ซึ่งไป run บน AWS Container Service อีกที การใช้งานค่อนข้างจะง่าย สะดวกและรวดเร็ว

เรามองหาอะไรต่อจากนี้ App2Container ไม่ได้ทำ refactoring อันนี้เราต้องเข้าใจตรงกันนิดนึง App2Container ไม่ได้แปลงจาก Monolith application ไปเป็น Mocroservice ให้ แต่ถ้าเรามีการเขียนแยกย่อย function อยู่แล้วใน Java หรือ .NET ก็จะง่ายและตรง microservice concept มากกว่าในการนำ App2Container convert app ขึ้น AWS Cloud Container Service. 

สุดท้ายนี้ อยากให้ลอง App2Container กัน สามารถเข้าไปดู tutorial เพิ่มเติมได้ รวมทั้ง link download มาลองกันอีกด้วย
https://docs.aws.amazon.com/app2container/latest/UserGuide/start-intro.html

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5lwzxt0rlxmqt3u397g.jpg)