Khai báo Infrastructure bằng code và khởi tạo môi trường đã khai báo bằng CloudFormation.
Các lợi ích:
- Cơ sở hạ tầng được cung cấp một cách nhất quán, với ít lỗi hơn (lỗi con người)
- Tiết kiệm thời gian và công sức hơn so với cấu hình tài nguyên bằng tay (khai báo 1 lần, dùng lại nhiều lần)
- Bạn có thể sử dụng version control và đánh giá bởi teammate cho các template CloudFormation
- Miễn phí sử dụng (chỉ bị tính phí cho các tài nguyên được cung cấp)
- Có thể được sử dụng để quản lý các bản cập nhật và dependency
- Có thể được sử dụng để rollback hoặc xóa toàn bộ stack.
Component
- Template: JSON hoặc YAML file, chứa Infrastructure
- Stack: toàn bộ môi trường định nghĩa bởi template và quá trình tạo, sửa, xoá
- NestedStack: re-use template cho các common case như ALB, Web Application
- StackSet: như Stack nhưng giữa các account, region, sử dụng 1 template để deploy lên các region khác nhau, các account khác nhau.
- Change Set: giống Git change, xem lại thay đổi trước khi update Stack.
- Direct update: submit thay đổi ngay lập tức, phù hợp deployment
- Create & update change set: preview trước khi apply
Logical ID: sử dụng để reference resource trong template
Physical ID: ID của resource sau khi resource được khởi tạo bằng stack, được tạo bởi AWS.
Có thể deploy stack qua Console, CLI hoặc API. Khi có lỗi sẽ mặc định sẽ tự động rollback toàn bộ stack (vẫn phải trả phí cho các resource đã khởi tạo nếu có lỗi)
Templates components
- Resources: Khai báo các resource mà CloudFormation sẽ khởi tạo
- Parameters: Khai báo các Input
- Mappings: Khai báo các variable đã biết trước ứng với các key
- Conditionals: Cần thiết khi tạo Resource với một hoặc các điều kiện
- Metadata
- Output: Các variable được output khi Stack hoàn thành
- Sử dụng Fn:ImportValue để reference
- Không thể xoá Stack nếu output được reference bởi Stack khác
Rollback
Mặc định sẽ rollback toàn bộ khi tạo mới, và khi update. Có thể setting để disable rollback để debug xem có vấn đề gì với template (nhưng không thể update template khi tạo mới nếu có lỗi).
UPDATE_ROLLBACK_FAILED
UPDATE_ROLLBACK_FAILED là state khi CloudFormation update version mới nhưng không thành công, sẽ rollback về version cũ, và xảy ra lỗi, solution
- Fix lỗi ngoài CloudFormation (VD như tạo lại resource đã bị xoá) rồi tiếp tục update stack
- Skip resource mà không thể rollback, lúc đó CloudFormation sẽ mark là UPDATE_COMPLETE
- Nested stack sảy ra lỗi thì sẽ thử rollback toàn bộ Stack liên quan
ChangeSets
Tạo và xem trước các thay đổi trong template đã upload trước khi apply
Nested Stacks
Khi cần sử dụng các resource common thì nên sử dụng nested stack, ví dụ như tạo ALB + Target Group
Nested Stack khác với Cross Stack, Cross Stack sử dụng output của Stack và sử dụng lại ở các Stack khác, trong khi Nested Stack tạo lại các Resource theo common Stack.
StackSet
Thực hiện Stack trên các Account và Region khác nhau. Từ root account tạo StackSet, các account khác có thể CRUD Stack instance từ StackSet. Khi update StackSet, tất cả các Stack Instance sẽ được update
Drift
Khi có action thay đổi config của resource tạo bởi CloudFormation, có thể sử dụng CloudFormation drift để xem lại các thay đổi này (Không phải tất cả resource đều support)
DeletionPolicy
- Retain
- Chỉ định resource nào sẽ được giữ lại khi xoá Stack
- Tất cả resource/nested stack đều hỗ trợ
- Snapshot
- Backup data trước khi xoá, nhưng chỉ hỗ trợ 1 số resource
- EBS, Elasticache, RDS, Redshift
- AWS::RDS::DBCluster mặc định là Snapshot
- Delete
- Option mặc định, xoá resource khi xoá stack
- Trường hợp muốn xoá S3 cần Empty bucket trước khi xoá
Termination Protection
Ngăn chặn xoá Stack
Stack Policies
Là JSON Document quy định Allow/Deny action trên các Resource trong Template. Khi set Stack Policy, mặc định tất cả các resource đều được protect (không cho phép update)

CFN Init
- cfn-init
- Lấy metadata, cài package, tạo file và start service
- cfn-signal
- Sử dụng cùng CreationPolicy hoặc WaitCondition, để đồng bộ các resource khác trong Stack
- cfn-get-metadata
- Lấy thông tin trong metadata theo path hoặc tree
- cfn-hup
- Deamon, check update metadata và execute custom hook khi phát hiện các thay đổi
- /ect/cfn-cfn-hup.conf
- /etc/cfn/hooks.d/cfn-auto-reloader.conf
Custom Resource

- AWS::CloudFormation::CustomResource hoặc Custom::MyCustomResourceTypeName
- Chỉ định ServiceToken để send request (là ARN của SNS hoặc Lambda)
- 2 Loại
- SNS
- Lambda
- Phải cùng Region với Stack
- CloudFormation sẽ gửi request kèm S3 Presign URL để SNS/Lambda push Object Json tới, sau đó CloudFormation sẽ đọc thông tin object đó để thực hiện tiếp
- Trường hợp sử dụng
- Resource mà CloudFormation không hỗ trợ
- OnPremise Resource
- Run Lambda để empty S3 trước khi xoá…


SSM Parameters
- Có thể lưu value trong SSM Parameter Store rồi reference trong template
- Max 60 dynamic reference
- AWS::SSM::Parameter::Name
- AWS::SSM::Parameter::Value<String>
- AWS::SSM::Parameter::Value<List<String>>
- AWS::SSM::Parameter::Value<ComaDelimitedList>
- AWS::SSM::Parameter::Value<AWS-Paramerter>
- AWS::SSM::Parameter::Value<List<AWS-Parameter>>
Dynamic References

- Hỗ trợ SSM, SSM Secure, Secret Manager
- SSM
- {{resolve:service-name:reference-key}}
- String, StringList
- Không hỗ trợ SSM Public
- Trườn hợp không chỉ định version thì sẽ lấy version public
- SSM Secure
- {{resolve:service-name:reference-key}}
- SecureString
- Trườn hợp không chỉ định version thì sẽ lấy version public
- Không hỗ trợ toàn bộ CloudFormation Resource
- Secret Manager
- {{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
- Để update Secret thì cần update cả Resource đang reference trong template
StackSets
- Deploy template tới các region/account khác nhau
- Khi update stack, tất cả các stack instance được update
- Regional service
- Có thể ủy quyền admin StackSets cho các tài khoản thành viên
- Apply tới tất cả các account trong Organization
- StackSet sẽ tạo Role và enable trusted access trong AWS Organization
- Phải enable tất cả các feature trong AWS Organization
- Có thể tự động deploy tới account mới được thêm vào Organization sau này
- Sử dụng Role khi cần deploy tới nhiều account/region khác nhau mà không nằm trong Organization
StackSets Drift
- Giống Stack Driff nhưng cho StackSet
- Trường hợp thay đổi trong Stack (Không phải StackSet) không được coi là Drift
- Có thể dừng Drift detection trên StackSet
Deployment Option
- Theo thứ tự
- Chỉ định thứ tự region/account sẽ thực hiện
- Thực hiện deploy 1 region ở 1 thời điểm
- Maximum Concurrent Account
- Số lượng hoặc % target account mỗi region sẽ deploy
- Failure Tolerance
- Số lượng hoặc % target account mỗi region mà có thể failure trước khi CloudFormation dừng deploy tới tất cả region
- Region Concurrency
- Deploy theo thứ tự (mặc định) hoặc song song
- Retain Stacks
- Khi xoá StackSet, có thể dùng để giữ lại Stack và resource