Beanstalk được biết đến như Platform as a Service (PaaS) solution, có vẻ giống như web hosting chạy các loại Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker web applications, bản chất sử dụng CloudFormation để khởi tạo các services.

Hỗ trợ các ngôn ngữ và các deployment stack sau
- Apache Tomcat for Java applications
- Apache HTTP Server for PHP applications
- Apache HTTP Server for Python applications
- Nginx or Apache HTTP Server for Node.js applications
- Passenger or Puma for Ruby applications
- Microsoft IIS 7.5, 8.0, and 8.5 for .NET applications
- Java SE
- Docker
- Go
Tích hợp cùng EventBridge để thông báo qua SNS/Lambda khi có các event sau
- CUD (fail, success, start)
- Các resource trong application như ASG, ELB, EC2…
- Managed update status (started, failed)
- Env health status
Có các layer sau
- Application
- Chứa env, env config, application version
- Có thể có nhiều version trong 1 application, được lưu trong S3
- Environment
- Development, Staging, Production
- Được config và khởi tạo bằng Beanstalk
ALB
Beanstalk có thể kết hợp cùng load balancer + auto scaling group (on demand hoặc combine nhiều option), kèm nhiều policy scaling. Có thể tạo 1 load balancer cho mỗi Beanstalk hoặc sử dụng chung với các Beanstalk khác (Dedicated or Shared).
Web server và Worker
- Web server: listen port (80, 443, …) và process http request
- Worker: Application dạng như xử lý các task trong background như xử lý input từ SQS queue, thường run liên tục, sử dụng cron.yml để define các task theo định kỳ

Deployment policy
- All at once: triển khai phiên bản mới đến tất cả các instance cùng một lúc.
- Deploy nhanh nhất
- Phù hợp với development, không phù hợp với production vì sẽ gây ra 1 khoản thời gian gián đoạn
- Nếu deploy fail phải rollback bằng cách deploy lại version trước đó
- Không mất thêm phí vì không run thêm gì cả
- Rolling: cập nhật một lô các instance, sau đó di chuyển sang lô tiếp theo khi lô đầu tiên đã pass healthcheck
- Application sẽ run 2 version khi lô đầu tiên update xong, thời gian deploy có thể sẽ lâu nếu chia thành nhiều lô.
- Không lý tưởng khi Application cần độ performance cao vì sẽ giảm số lượng instance có thể nhận trafic trong 1 khoảng thời gian
- Không mất thêm chi phí, cần rollback các instance đã deploy fail.
- Rolling with additional batch: tương tự như Rolling nhưng khởi chạy các instance mới trong một lô, đảm bảo sẵn sàng đầy đủ trước khi chuyển tiếp lưu lượng truy cập.
- Tương tự như rolling nhưng mất thêm 1 khoản phí tuỳ số lượng intance trong 1 lô, do run thêm 1 lô, được cái vẫn giữ nguyên capacity
- Immutable: khởi chạy các instance mới trong một ASG mới và triển khai phiên bản mới trên các instance này trước khi chuyển lưu lượng truy cập đến các instance mới này khi chúng pass healthcheck.
- Blue/green: tạo một môi trường “stage” mới và triển khai phiên bản mới tại đó. Khi phiên bản mới được test và chấp nhận, chuyển hướng lưu lượng truy cập đến môi trường mới này và loại bỏ môi trường cũ nếu cần thiết. (KHÔNG CÓ TRỰC TIẾP TRONG Beanstalk)


Elastic Beanstalk CLI
- eb create
- eb status
- eb health
- eb events
- eb logs
- eb open
- eb deploy
- eb config
- eb terminate
Lifecycle Policy
- Có thể lưu 1000 version của app
- Nếu không xoá version cũ, app sẽ không thể deploy nếu vượt quá
- Sử dụng lifecycle policy để xoá version cũ
- Based on time (version cũ sẽ bị xoá)
- Base on space (khi có quá nhiều version)
- Không thể xoá version đang được sử dụng
- Có thể xoá cả source bundle trên S3 hoặc giữ lại, chỉ xoá versionBeanstalk
- Cần role để sử dụng
Beanstalk Extensions
Config sẵn option của Beanstalk bằng cách sử dụng file trong code
- Chứa trong folder .ebextensions
- File format json hoặc yaml
- Đuôi file phải là .config
- Sử dụng option_settings nếu cần sửa default setting
- Có thể add các resource khác như RDS, cache, DynamoD…, các resource này sẽ bị xoá khi env của Beanstalk bị xoá
Cloning
- ALB
- Tạo env mới y hệt env cũ (không dùng clone)
- Update CNAME hoặc Route53 update để chuyển traffic sang env mới.
- RDS
- Create RDS snapshot
- Setting RDS protection from deletion
- Tạo env mới (Không bao gồm RDS), sau đó sử dụng connection string để connect tới rds hiện tại.
- Update CNAME/Route53 point tới env mới
- Xoá env cũ
- Xoá CloudFormation Stack (vì RDS không bị xoá, Stack CloudFormation fail, cần xoá thủ công)
Migrations
Không thể thực hiện chuyển loại load balancer sau khi tạo env, vì vậy khi cần update load balancer thì cần thực hiện migration.
AWS CodePipeline with AWS Elastic Beanstalk
Có thể tích hợp Code Pipeline với Beanstalk