Run AWS on local with LocalStack
พอดีได้เจอของดีที่น่าแบ่งปันแล้วก็รู้สึกว่าน่าจะรู้จักกันตั้งนานแล้ว แง้ นั่นก็คือออ น้อง LocalStack (เปาะแปะๆๆๆ /เสียงตบมือ)
LocalStack เป็นตัวจำลอง service ต่างๆ ของ AWS โดยไม่ต้องไปยุ่งกับ AWS จริงๆ ทำให้เราสามารถลอง flow ของสิ่งที่เราเขียน ว่าทุกๆ อย่างต่อกันอย่างราบรื่นป่าว อันนี้ github น้อง https://github.com/localstack/localstack ใช้ง่ายมั่กๆ วันนี้จะลองทำแบบใช้ docker-compose ละกัน เพราะว่าแค่มี docker ก็สามารถใช้ทุกๆ service ได้เลยงับ แต่ความจริงก็มีข้อจำกัดที่ใช้บาง service ไม่ได้ (เช็คได้ที่นี่ https://docs.localstack.cloud/aws/feature-coverage/) บางตัวต้องเป็นแบบ pro ถึงจะใช้ได้ แต่เราจะมาลองเล่นแบบเอา service พื้นฐานมาต่อๆ กันดู flow น่าจะเป็นประมาณนี้
เราจะสมมติว่าเราเป็น service ที่จะรับ event มาจากเพื่อนๆ ผ่าน EventBridge ที่เราสร้าง rules ไว้ให้ event ที่ match pattern ที่ให้ target ไปที่ lambda แล้วก็เอาไปเก็บไว้ที่ DynamoDB
Prerequisites
- Terraform เพราะเราจะใช้สิ่งนี้จำลอง service ต่างๆ ขึ้นมา
- Docker จะใช้ image LocalStack ผ่าน docker งับ
- Python สำหรับ test แล้วก็จะใช้บน lambda ด้วยที่จะ save ลง DB
เริ่มจาก file docker-compose.yml
ใช้ image ของ localstack ที่มีไว้ให้ แล้วก็จะมีตรงส่วนสำคัญคือ SERVICES จะเป็น list ของ service ที่เราจะใช้ในบทความนี้เราจะลองใช้แค่ EventBridge, Lambda แล้วก็ DynamoDB งับ
ต่อด้วยไฟล์ terraform ที่เราจะใช้สร้าง event_bus, event_rule, event_target, dynamodb_table แล้วก็ lambda ในส่วนของ provider เราต้องใส่ endpoints สำหรับ service ต่างๆ ด้วย สิ่งที่ดีของการที่เราจะ test พวก service ต่างๆ บน local เราไม่จำเป็นต้องมี credentials อะไรเบย เป็นความรู้สึกที่แบบ แฮปปี้สุดๆ 55555 ข้างล่างคือไฟล์ main.tf
ต่อไปเราจะทำ code ในส่วนของ lambda ของเรา
!! ข้อควรระวัง: ชื่อไฟล์ กับชื่อ function ถูกใช้ในไฟล์ tf น้า บรรทัดที่ 46 ของ main.tf ของเรา ต้องตรงเป๊ะๆ เลย
แล้วเราก็จะ zip ไฟล์ python อันนี้ ให้เป็นชื่อที่ตรงกับ filename บรรทัดที่ 44 ใน main.tf
$ zip lambda-layer-localstack.zip lambda_function.py
ต่อไปเราก็จะ start docker ของเรา แล้วก็สร้าง service ต่างๆ ด้วย terraform ตาม command นี้เลย
$ docker compose up --build
$ terraform init
$ terraform apply --auto-approve
เท่านี้ก็เรียบร้อยยยย เราสามารถ ใช้ aws-cli ดูพวก service ของเราใน docker ได้ด้วยนะ ตัวอย่างเช่น
$ docker exec <CONTAINER_ID> awslocal dynamodb list-tables --region ap-southeast-1## result should be look like this
{
"TableNames": [
"PetsCollection"
]
}
สุดท้าย เราลอง put event ไปที่ EventBridge
แล้วไหนลอง db scan ดูหน่อยย ว่ามีของที่เราใส่ไปมะกี้ป่าว
เย้ สำเร็จ เป็นอันเสร็จเรียบร้อยยยย ที่เขียนอันนี้เพราะว่าอยากจดไว้เฉยๆ กลัวลืมมม ว่าเคยใช้ แล้วใช้แบบไหน 55555 ขอบคุณทุกคนที่เข้ามาอ่านน้า ถ้ามีอะไรอยากแนะนำ เม้นไว้ได้เลยงับ ขอบคุณค่า 😊