AWS CloudFormation cung cấp cho các nhà phát triển và quản lý hệ thống một phương pháp khởi tạo và quản lý dễ dàng các nguồn tài nguyên AWS, cung cấp cũng như cập nhật chúng một cách có thứ tự và dễ dự đoán.

Bạn có thể sử dụng các template mẫu của AWS CloudFormation hoặc sử dụng template do chính bạn tự viết ra để mô tả các tài nguyên AWS, các liên kết cũng như các thông số kỹ thuật cần thiết để hệ thống của bạn có thể hoạt động. Bạn không nhất thiết phải nắm rõ mọi thứ liên quan tới các service AWS hoặc tìm hiểu cách hoạt động của các dependency (các phần phụ thuộc). CloudFormation sẽ xử lý giúp bạn hầu hết công việc. Sau khi các tài nguyên AWS được triển khai, bạn có thể chỉnh sửa và cập nhật chúng theo cách dễ kiểm soát và dự đoán, bạn làm việc với cấu trúc infra của AWS gần giống như cách mà bạn sử dụng version control đối với các phần mềm vậy.

Bạn có thể deploy, cập nhật một template và các tập hợp tài nguyên liên kết với nó (được gọi là stack) bằng cách sử dụng Màn hình quản lý AWS (Management console), Giao diện dòng lệnh AWS (Command Line Interface) hoặc các API. Bạn có thể sử dụng CloudFormation mà không bị tính thêm chi phí nào, bạn chỉ cần phải trả tiền cho các tài nguyên AWS mà bạn cần để ứng dụng của bạn hoạt động.

AWS CloudFormation là một dịch vụ hỗ trợ việc thiết lập các tài nguyên của Amazon Web Service, nhờ đó bạn chỉ cần bỏ ra ít thời gian để quản lý các tài nguyên đó và có thể tập trung vào phát triển ứng dụng chạy trên AWS. Bạn tạo ra một template mô tả tài nguyên AWS mà bạn muốn (như là Amazon EC2 innstance hoặc Amazon RDS DB instance), và AWS CloudFormation xử lý việc cung cấp và thiết lập các tài nguyên đó giúp bạn. Bạn không cần thiết phải tạo, thiết lập từng tài nguyên một, cũng không cần phải quan tâm phần nào phụ thuộc vào phần nào, AWS Cloud Formation sẽ làm giúp bạn.

Quản lý cấu trúc Infra một cách đơn giản

Đối với các ứng dụng web có thể mở rộng và bao gồm các back-end database, bạn có thể sử dụng một Auto Scaling group, một Elastic Load Balancing load balancer, và một Amazon Relational Database instance. Thông thường, bạn có thể sử dụng các service đơn lẻ để cung cấp các tài nguyên đó. Và sau khi bạn tạo ra tài nguyên, bạn có thể phải thiết lập để chúng hoạt động với nhau. Tất cả các tác vụ đó có thể sẽ gây tốn thêm thời gian và độ phức tạp cho giai đoạn chuẩn bị cài đặt và chạy ứng dụng của bạn.

Thay vào đó, bạn chỉ phải tạo ra hoặc chỉnh sửa một AWS CloudFormation template có sẵn. Một template mô tả tất cả các tài nguyên và tính chất của chúng. Khi bạn sử dụng template đó để tạo ra một AWS CloudFormation stack, AWS CloudFormation cung cấp Auto Scaling group, load balancer và database cho bạn. Sau khi stack đã được tạo thành công, các tài nguyên AWS của bạn sẽ được cài đặt và chạy. Bạn cũng có thể xóa stack một cách dễ dàng để xóa tất cả các tài nguyên trong nó. Bằng cách sử dụng AWS CloudFormation, bạn dễ dàng quản lý một tập hợp các tài nguyên như một đơn vị quản lý.

Sao chép cấu trúc hạ tầng một cách nhanh chóng

Nếu ứng dụng của bạn cần sự ổn định, có thể hoạt động mà không bị ngắt quãng, bạn có thể sao chép nội dung của nó đặt ở nhiều server trên các khu vực (region) khác nhau, bằng cách đó nếu ứng dụng của bạn gặp vấn đề ở một khu vực, người dùng vẫn có thể truy cập vào ứng dụng tại các server khác. Việc sao chép ứng dụng của bạn cũng chính là sao chép các tài nguyên. Bạn không những phải sao chép từng tài nguyên ứng dụng cần thiết mà bạn còn phải cài đặt và thiết lập chúng trên từng khu vực.

Khi bạn sử dụng AWS CloudFormation, bạn có thể tái sử dụng template của mình để cài đặt tài nguyên một cách nhất quán và dễ dàng. Chỉ cần mô tả các tài nguyên của bạn một lần, và sau đó tạo ra các tài nguyên y hệt nhau nhiều lần trên nhiều khu vực.

Dễ dàng điều khiển và theo dõi các thay đổi ở cấu trúc Infra

Trong một số trường hợp, bạn có thể sẽ cần phải nâng cấp một số tài nguyên của mình một cách từ từ. Ví dụ, trong Auto Scaling Launch Configuration, bạn có thể sẽ cần nâng cấp lên một kiểu instance có hiệu suât làm việc cao hơn để làm giới hạn trên số lượng các instance trong Auto Scaling group. Nếu bạn gặp vấn đề sau khi nâng cấp, bạn cần roll-back cấu trúc infra của mình về thiết lập ban đầu. Nếu làm việc này một cách thủ công, bạn không chỉ phải nhớ mình đã thay đổi ở những tài nguyên nào mà còn phải nhớ thiết lập ban đầu như thế nào.

Khi bạn tạo ra cấu trúc Infra với AWS CloudFormation, AWS CloudFormation mô tả chính xác các tài nguyên và thiết lập của chúng. Bởi vì các template này đơn giản chỉ là các text file, bạn dễ dàng theo dõi được sự thay đổi trong các template nhờ đó biết được sự thay đổi của cấu trúc infra, giống như cách các lập trình viên theo dõi source code bằng version control. Tại thời điểm nào đó, nếu cần đổi lại thiết lập của cấu trúc Infra, bạn chỉ cần sử dụng template trước của mình.

Các khái niệm của AWS CloudFormation

Khi bạn sử dụng AWS CloudFormation, bạn làm việc với các template và stack. Bạn tạo ra các template để mô tả các tài nguyên AWS và các tính chất của nó. Mỗi khi bạn tạo ra một stack, AWS CloudFormation cung cấp các tài nguyên theo như bạn mô tả trong template.

Templates

Một template AWS CloudFormation là một file text có định dạng theo chuẩn JSON. Bạn có thể lưu các file này với mọi kiểu đuôi mở rộng, ví dụ như .json, .template, .txt… AWS CloudFormation sử dụng những template này như một bản thiết kế để xây dựng các tài nguyên AWS của bạn. Ví dụ, trong một template, bạn có thể mô tả các đặc tính của một Amazon EC2 instance, chẳng hạn như kiểu instance, AMI ID, block device mappings, và Amazon EC2 key pair của nó.

Ví dụ tiếp theo, nếu bạn tạo một stack với template sau đây, AWS CloudFormation sẽ cung cấp cho bạn một instance với AMI ID là ami-2f726546, kiểu instance là t1.micro, key pair name là testkey, và một Amazon EBS.

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "A sample template",
  "Resources" : {
    "MyEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-2f726546",
        "InstanceType" : "t1.micro",
        "KeyName" : "testkey",
        "BlockDeviceMappings" : [
          {
            "DeviceName" : "/dev/sdm",
            "Ebs" : {
              "VolumeType" : "io1",
              "Iops" : "200",
              "DeleteOnTermination" : "false",
              "VolumeSize" : "20"
            }
          }
        ]
      }
    }
  }
}

Bạn cũng có thể chỉ định một loạt các tài nguyên với chỉ một template và thiết lập các tài nguyên này làm việc cùng với nhau. Ví dụ như, bạn có thể chỉnh lại template ở trên để thêm một Elastic IP (EIP) và kết nối nó với Amazon EC2 Instance, như ở ví dụ sau:

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "A sample template",
  "Resources" : {
    "MyEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-2f726546",
        "InstanceType" : "t1.micro",
        "KeyName" : "testkey",
        "BlockDeviceMappings" : [
          {
            "DeviceName" : "/dev/sdm",
            "Ebs" : {
              "VolumeType" : "io1",
              "Iops" : "200",
              "DeleteOnTermination" : "false",
              "VolumeSize" : "20"
            }
          }
        ]
      }
    },
    "MyEIP" : {
      "Type" : "AWS::EC2::EIP",
      "Properties" : {
        "InstanceId" : {"Ref": "MyEC2Instance"}
      }
    }
  }
}

Các template trên được xây dựng xung quanh một Amazon EC2, tuy nhiên AWS CloudFormation còn có khả năng xây dựng các tập hợp tài nguyên phức tạp và tái sử dụng chúng trong nhiều ngữ cảnh. Bạn có thể thêm các thông số khác khi tạo một stack chẳng hạn như kiểu instance thay vì thêm vào khi tạo template, điều này giúp một template có thể được tái sử dụng đối với nhiều trường hợp.

Stacks

Khi sử dụng AWS CloudFormation, bạn quản lý các tài nguyên liên quan như một đơn vị được gọi là stack. Nói cách khác, bạn tạo, cập nhật, xoá một tập hợp các tài nguyên bằng cách tạo, cập nhật và xoá các stacks. Tất cả các tài nguyên trong một stack được định nghĩa bởi AWS CloudFormation template của stack đó. Chẳng hạn, bạn tạo một template bao gồm một Auto Scaling group, Elastic Load Balancing load balancer và một Amazon RDS database instance. Để tạo các tài nguyên đó, bạn tạo một stack bằng cách gửi template bạn vừa tạo, và AWS CloudFormation sẽ cung cấp các tài nguyên đó cho bạn. Để cập nhật các tài nguyên, đầu tiên bạn chỉnh sửa template gốc của stack và cập nhật stack bằng cách gửi template đã được chỉnh sửa. Bạn có thể làm việc với stack bằng cách sử dụng AWS CloudFormation consoleAPI hoặc AWS CLI.

AWS CloudFormation hoạt động như thế nào?

Mỗi khi bạn tạo một stack, AWS CloudFormation truyền lệnh tới các dịch vụ chạy ngầm của AWS để cung cấp và thiết lập các tài nguyên. Bạn cần lưu ý AWS CloudFormation chỉ thực hiện các lệnh nằm trong quyền hạn mà bạn có. Ví dụ, để tạo một instance Amazon EC2, bạn cần có quyền tạo instance. Bạn cũng cần quyền tắt instance nếu muốn xóa một stack với các instance bên trong. Bạn sử dụng AWS Identity and Access Management để quản lý việc phân quyền.

Lệnh gọi mà AWS thực hiện được dựa trên những gì được mô tả trong template của bạn. Chẳng hạn, bạn có một template mô tả một Amazon EC2 instance với kiểu instance là t1.micro. Khi bạn sử dụng template đó để tạo ra một stack, AWS CloudFormation gọi tới API tạo Amazon EC2 và chỉ ra kiểu instance đó là t1.micro. Sơ đồ sau đây tóm tắt lại quá trình tạo ra một Stack của AWS CloudFormation.

create-stack-diagram.png
  1. Bạn tạo một template (document định dạng JSON) trong một text editor hoặc lấy một template có sẵn. Ví dụ, nếu bạn muốn tạo một Amazon EC2 instance. Bạn sử dụng template có dạng như sau:
  {
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Description" : "A simple Amazon EC2 instance",
    "Resources" : {
      "MyEC2Instance" : {
        "Type" : "AWS::EC2::Instance",
        "Properties" : {
          "ImageId" : "ami-2f726546",
          "InstanceType" : "t1.micro"
        }
      }
    }
  }
  1. Nếu bạn tạo template, bạn có thể đặt tên file với đuôi mở rộng bất kì như .json, .txt…Bạn cũng có thể lưu file ở máy tính cá nhân hoặc lưu trên Amazon S3 bucket.
  2. Bạn tạo AWS CloudFormation stack và chỉ ra địa chỉ của file template. Địa chỉ đó có thể là một file trên máy tính local hoặc một URL của Amazon S3. Bạn có thể tạo stack bằng cách sử dụng AWS CloudFormation consoleAPIAWS CLI.

Chú ý: Nếu bị sử dụng một file template nằm ở local, AWS CloudFormation cũng vẫn upload nó lên một Amazoon S3 bucket trong AWS account của bạn. AWS CloudFormation tạo ra một bucket duy nhất cho mỗi region nhằm mục đích phục vụ cho việc upload file template. Bucket này có thể được truy nhập bởi mọi user với quyền truy nhập S3 trong account của bạn. Nếu bucket được tạo ra bởi AWS CloudFormation đã có từ trước, file template sẽ được đưa vào bucket đó.

Bạn có thể sử dụng bucket của riêng bạn và điều chỉnh quyền của nó để upload file template một cách thủ công vào Amazon S3. Sau đó, mỗi khi bạn tạo ra hoặc cập nhật một stack, bạn chỉ ra cả Amazon S3 URL của file template.

AWS CloudFormation cung cấp và thiết lập các tài nguyên bằng cách gọi tới các AWS service được mô tả trong template. Sau khi tất cả các resource đã được tạo, AWS CloudFormation truyền tín hiệu thông báo stack đã được tạo thành công. Sau đó bạn có thể sử dụng tất cả các resource trong stack. Nếu gặp lỗi trong việc tạo ra stack, AWS CloudFormation sẽ roll-back tất cả các thay đổi và xóa mọi tài nguyên vừa được tạo ra.

Quá trình cập nhật một stack

Khi bạn cập nhật một stack, bạn chỉnh sửa lại file template gốc của stack. AWS Formation so sánh template đã được chỉnh sửa với template gốc và cập nhật chỉ những tài nguyên đã thay đổi. Sơ đồ sau tóm tắt lại quá trình cập nhật một stack.

update-stack-diagram.png

Chú ý: Việc cập nhật có thể dẫn tới gián đoạn trong hoạt động của service. Phụ thuộc vào tài nguyên và các tính chất mà bạn chỉnh sửa, việc cập nhật có thể làm gián đoạn hoặc thay thế hẳn tài nguyên đã có. Để có thêm thông tin, hãy tham khảo tại đây AWS CloudFormation Stacks Updates

  1. Bạn sử một AWS CloudFormation stack template bằng text editor. Ví dụ, bạn muốn đổi kiểu instance của Amazon EC2 instance. Trong file template gốc, sửa lại dòng định nghĩa kiểu instance cho instance đó.
  2. Bạn lưu lại AWS CloudFormation template ở local hoặc trên Amazon S3 bucket.
  3. Bạn chọn AWS CloudFormation stack mà bạn muốn update và chỉ ra địa chỉ, đường dẫn của file template đã sửa. Bạn có thể update stack bằng cách sử dụng AWS CloudFormation consoleAPIAWS CLI.

Chú ý: Nếu bạn chỉ định một file template ở local, AWS CloudFormation tự động upload template của bạn lên một Amazon S3 bucket trong AWS account của bạn.

AWS CloudFormation so sánh file template đã sửa với file template gốc, cập nhật chỉ những tài nguyên mà bạn muốn thay đổi. Sau khi các tài nguyên đã được cập nhật, AWS CloudFormation gửi tín hiệu cập nhật thành công stack. Nếu việc cập nhật thất bại, AWS CloudFormation roll-back mọi thay đổi của bạn về trạng thái trước khi cập nhật.

Quá trình xóa một stack

Khi bạn xóa một stack, bạn chỉ ra stack cần xóa, và AWS CloudFormation xóa stack cùng tất cả các tài nguyên bên trong nó. Bạn có thể xóa stack bằng cách sử dụng AWS CloudFormation consoleAPIAWS CLI.

Nếu bạn muốn xóa một stack nhưng muốn giữ lại một vài resource bên trong nó, bạn có thể sử dụng deletion policy để giữ lại các tài nguyên đó.

Sau khi tất cả các resource bị xóa, AWS CloudFormation gửi tín hiệu thông báo stack của bạn đã được xóa thành công. Nếu AWS CloudFormation không thể xóa một tài nguyên nào đó, stack sẽ không bị xóa. Những tài nguyên chưa bị xóa sẽ tồn tại cho tới khi bạn có thể xóa thành công stack.

Cơ bản về Template

AWS CloudFormation template là gì?

Như đã nói ở trên, template là một đoạn mô tả tài nguyên AWS sử dụng để tạo ra stack. Template được lưu trữ dưới dạng một text file có định dạng chuẩn JavaScript Object Notation (JSON).

Trong một template, bạn sử dụng cấu trúc JSON mà AWS CloudFormation có thể lý giải được để để mô tả các tài nguyên AWS mà bạn muốn tạo và thiết lập. Trong định dạng JSON, một object được mô tả như một cặp key-value hoặc nối một key với một tập hợp của các object con được đóng trong ngoặc nhọn. Các object anh em được phân cách bởi dấu phẩy. Một AWS CloudFormation template được bắt đầu bởi dấu mở ngoặc nhọn và kết thúc bởi dấu đóng ngoặc nhọn. Bên trong các ngoặc đó, bạn có thể mô tả các top-level JSON objects. Top-level JSON object duy nhất bắt buộc phải có là object Resources, bạn cần phải đưa ra ít nhất một resource. Hãy bắt đầu với template cơ bản nhất bao gồm chỉ một object Resources, object này chứa một câu mô tả resource.

Resources: Hello Bucket!

Object Resources chứa một danh sách các object resource bên trong cặp ngoặc nhọn. Một mô tả resource bao gồm các đặc tính của resource đó, được mô tả bằng các object con. Một resource bắt buộc phải có đặc tính Type, định nghĩa kiểu của AWS resource mà bạn muốn tạo. Đặc tính Type phải có định dạng như sau:

AWS::ProductIdentifier::ResourceType

Ví dụ, kiểu resource cho một Amazon S3 bucket là AWS::S3::Bucket. Để biết được danh sách chi tiết các kiểu tài nguyên, xem ở Template Reference.

Chúng ta hãy xem qua một template rất cơ bản sau. Template này mô tả một resource có kiểu AWS::S3::Bucket với teen là HelloBucket.

{
    "Resources" : {
        "HelloBucket" : {
            "Type" : "AWS::S3::Bucket"
        }
    }
}

Các element là chuỗi ký tự được đặt trong cặp dấu ngoặc kép. nếu bạn sử dụng template này để tạo ra một stack, AWS CloudFormation sẽ tạo ra một Amazon S3 bucket. Tạo ra một bucket không khó khăn vì AWS CloudFormation có thể tạo một bucket với thiết lập mặc định. Đối với các tài nguyên khác, chẳng hạn như Auto Scaling group hoặc instance EC2, AWS CloudFormation yêu cầu nhiều thông tin hơn. Mô tả tài nguyên sử dụng một đặc tính Properties để chỉ ra thông tin dùng để tạo ra tài nguyên.

Tùy vào loại resource, một số property bắt buộc phải có, ví dụ như property ImageId cho một tài nguyên AWS::EC2::Instance, và một số property khác là tùy ý, có thể có có thể không. Một số property có giá trị mặc định, ví dụ như AccessControl của AWS::S3::Bucket. Do đó việc chỉ định một giá trị cho property đó là tùy ý. Các property khác không cần thiết phải có để tài nguyên có thể hoạt động nhưng bạn có thể thiết lập nếu bạn muốn. Trong ví dụ vừa rồi, do AWS::S3::Bucket chỉ có các property tùy ý nên chúng ta không cần thêm bất kỳ nội dung nào để template có thể hoạt động, chúng ta sử dụng các thiết lập mặc định của nó.

Bạn có thể tìm hiểu về các property cho mỗi kiểu resource ở đây, Resource Property Types Reference.

Các Property của tài nguyên và sử dụng các tài nguyên cùng nhau

Thông thường, một property cho một tài nguyên đơn giản chỉ là một chuỗi ký tự. Ví dụ, template sau đây chỉ ra một ACL (Access Control List) (PublicRead) cho property AccessControl của bucket.

{
    "Resources" : {
        "HelloBucket" : {
            "Type" : "AWS::S3::Bucket",
            "Properties" : {
               "AccessControl" : "PublicRead"
            }
        }
    }
}

Một vài resource có thể có nhiều property, và một và property có thể có một hoặc nhiều subproperty. Ví dụ, resource AWS::S3::Bucket có hai property, AccessControl và WebsiteConfiguration. Property WebsiteConfiguration có hai subproperty là IndexDocument và ErrorDocument. Hãy cùng xem template sau:

{
    "Resources" : {
        "HelloBucket" : {
            "Type" : "AWS::S3::Bucket",
            "Properties" : {
               "AccessControl" : "PublicRead",
               "WebsiteConfiguration" : {
                    "IndexDocument" : "index.html",
                    "ErrorDocument" : "error.html"
               }
            }
        }
    }
}

Chú ý cách các property anh em – AccessControl và WebsiteConfiguration, và IndexDocument và ErrorDocument – được phân cách bởi các dấu phẩy. Một trong những lỗi cú pháp xuất hiện nhiều nhất là thiết dấu phẩy giữa các property anh em hay giữa các resource.

Một trong những lợi ích lớn nhất mà template và AWS CloudFormation mang lại đó là khả năng tạo một tập hợp các tài nguyên hoạt động cùng nhau để tạo ra một ứng dụng. Tên sử dụng cho một tài nguyên bên trong template là tên logic. Khi AWS CloudFormation tạo ra tài nguyên, nó tạo ra một tên vật lý dựa trên sự kết hợp của tên logic, tên stack và một unique ID.

Bạn sẽ tự hỏi bằng cách nào để thiết lập các property của một resource dựa trên tên hoặc property của một tài nguyên khác. Ví dụ, bạn có thể tạo ra một CloudFront distribution của một S3 bucket hoặc một instance EC2 sử dụng EC2 security groups, và tất cả các tài nguyên được tạo với chỉ cùng một template. AWS CloudFormation có một số hàm nội tại cho phép bạn link tới các tài nguyên khác và các property của chúng. Bạn có thể sử dụng Ref function để link tới một property nhận dạng của một resource. Thông thường, đây là tên vật lý của tài nguyên; tuy nhiên, đôi khi nó có thể là một identifier, chẳng hạn như IP address cho một tài nguyên AWS::EC2::EIP hoặc một Amazon Resource name (ARN) cho một topic của Amazon SNS. Để tham khảo danh sách của các giá trị trả về bởi Ref function ở đây, Ref function. Template sau đây bao gồm một tài nguyên AWS::EC2::Instance. Property SecurityGroups của tài nguyên gọi một Ref function để link tới tài nguyên AWS::EC2::SecurityGroup có nhận dạng là InstanceSecurityGroup.

{
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "KeyName" : "mykey",
        "ImageId" : ""
      }
    },

    "InstanceSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Enable SSH access via port 22",
        "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "0.0.0.0/0"
        } ]
      }
    }
  }
}

Có lẽ bạn cũng nhận thấy lời gọi của Ref function được biểu thị giống các JSON object, khi các cặp key-value được chia ra bởi dấu hai chấm và bao quanh bởi các cặp ngoặc nhọn. Key chính là tên function và thông số là các value. Bạn cũng sẽ nhận thấy rằng lời gọi function được bao quanh bởi các ngoặc nhọn. Trong JSON, danh sách được bao quanh bởi các ngoặc vuông. Property SecurityGroups là một danh sách của các security groups, và trong ví dụ trên, chúng ta chỉ có một phần tử trong danh sách. Ở template sau đây, có thêm một phần tử trong danh sách các SecurityGroup.

{
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ],
        "KeyName" : "mykey",
        "ImageId" : "ami-7a11e213"
      }
    },

    "InstanceSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Enable SSH access via port 22",
        "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "0.0.0.0/0"
        } ]
      }
    }
  }
}

MyExistingSecurityGroup là một chuỗi ký tự link tới một EC2 security group đã có từ trước thay vì một security group đã được mô tả trong template. Bạn chỉ cần sử dụng các chuỗi ký tự để link tới các tài nguyên AWS đã có.

Trong ví dụ trên, property KeyName của AWS::EC2::Instance là một chuỗi ký tự mykey. Điều này có nghĩa là một key pair với tên mykey phải có từ trước ở region mà stack được tạo ra, nếu không, việc tạo stack sẽ thất bại vì hệ thống không thể tìm được key pair đó.

Tài liệu tham khảo

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html