17

Tôi đang sử dụng cloudformation để tạo một ngăn xếp có chứa một cá thể ec2 được tự động hóa và một thùng S3. Đối với nhóm S3, tôi đã đặt DeletionPolicy thành Retain, hoạt động tốt, cho đến khi tôi muốn chạy lại tập lệnh cloudformation của mình một lần nữa. Kể từ lần chạy trước, kịch bản đã tạo nhóm S3, nó không thành công trong các lần chạy tiếp theo nói rằng thùng S3 của tôi đã tồn tại. Tất nhiên, không có tài nguyên nào khác được tạo ra. Câu hỏi của tôi là làm thế nào để kiểm tra xem thùng S3 của tôi có tồn tại đầu tiên bên trong kịch bản đám mây hay không, và nếu có, thì bỏ qua việc tạo tài nguyên đó. Tôi đã nhìn vào điều kiện trong AWS, nhưng có vẻ như tất cả các tham số dựa trên, tôi vẫn chưa tìm thấy một chức năng mà kiểm tra từ các nguồn lực hiện có.Cách kiểm tra xem tài nguyên cụ thể đã tồn tại trong tập lệnh CloudFormation

Trả lời

12

Không có cách rõ ràng để thực hiện việc này, trừ khi bạn tạo mẫu động với kiểm tra rõ ràng. Ngăn xếp được tạo từ cùng một mẫu là các thực thể độc lập và nếu bạn tạo ngăn xếp chứa nhóm, hãy xóa ngăn xếp trong khi giữ lại nhóm và sau đó tạo ngăn xếp mới (ngay cả một ngăn có cùng tên), không có kết nối nào giữa ngăn xếp mới và nhóm được tạo như một phần của ngăn xếp trước đó.

Nếu bạn muốn sử dụng cùng một thùng S3 cho nhiều ngăn xếp (ngay cả khi chỉ có một ngăn chứa), nhóm đó không thực sự thuộc về ngăn xếp - điều đó sẽ có ý nghĩa hơn khi tạo nhóm trong ngăn xếp riêng biệt, sử dụng một mẫu riêng biệt (đặt URL nhóm trong phần "Đầu ra"), và sau đó tham khảo nó từ ngăn xếp ban đầu của bạn bằng cách sử dụng một tham số.

+2

Mục tiêu là tạo ngăn xếp cho đăng ký Docker - thùng để phục vụ dưới dạng phụ trợ để lưu trữ hình ảnh và máy chủ lưu trữ ec2 làm chính bản thân docker, cộng với tất cả các nhóm bảo mật và chính sách IAM cần thiết. Trong tâm trí của tôi, nó là một thực thể, do đó tôi đã hy vọng tạo ra 1 kịch bản đủ linh hoạt. Tôi nghĩ rằng tôi sẽ chỉ tạo một điều kiện và nhập một tham số bằng cách sử dụng các kịch bản lệnh Amazon CLI khi tôi chạy nó, đó là cách duy nhất tôi thấy cách bạn có thể làm cho kịch bản cloudfomration hoàn toàn tự động và chạy lại được. – alexfvolk

4

Chỉ cần thêm thông số đầu vào vào mẫu CloudFormation để cho biết rằng nhóm hiện tại nên được sử dụng .... trừ khi bạn chưa biết tại thời điểm bạn sẽ sử dụng mẫu? Sau đó, bạn có thể thêm tài nguyên mới hoặc không dựa trên giá trị tham số.

0

Nếu bạn cập nhật, (có khả năng ngăn xếp trong ngăn xếp hay còn gọi là Ngăn xếp lồng nhau), các phần không thay đổi sẽ không được cập nhật. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html?icmpid=docs_cfn_console_designer

Sau đó, bạn có thể đặt các chính sách như đã đề cập để tránh xóa. [ghi nhớ 'hủy bỏ cập nhật' quyền cho rollbacks] https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html

Ngoài ra còn có đầu ra ngăn xếp chéo để nhận biết bằng cách thêm tên xuất vào đầu ra ngăn xếp. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html Walkthrough ... http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html

Sau đó, bạn cần phải sử dụng Fn :: ImportValue ... http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

Điều đó ngụ ý người ta có thể sử dụng một tham số mạng stack tên.

Rất tiếc, bạn gặp lỗi như thế này khi bạn thử chúng trong Điều kiện.

Template validation error: Template error: Cannot use Fn::ImportValue in Conditions.

Hoặc trong tham số?

Template validation error: Template format error: Every Default member must be a string.

Ngoài ra điều này có thể xảy ra trong khi cố gắng ...

Template format error: Output ExportOut is malformed. The Name field of Export must not depend on any resources, imported values, or Fn::GetAZs.

Vì vậy, bạn không thể ngăn chặn nó làm cho nguồn tài nguyên hiện có một lần nữa từ cùng một tập tin. Chỉ khi đưa nó vào ngăn xếp khác và sử dụng tham chiếu nhập khẩu.

Nhưng nếu bạn tách riêng hai thì có sự phụ thuộc sẽ dừng và quay lại ví dụ như xóa phụ thuộc, nhờ tham chiếu qua hàm ImportValue.

Ví dụ đưa ra ở đây là:

Đầu Thực hiện một Nhóm Template

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Metadata": { 
    "AWS::CloudFormation::Designer": { 
     "6927bf3d-85ec-449d-8ee1-f3e1804d78f7": { 
     "size": { 
      "width": 60, 
      "height": 60 
     }, 
     "position": { 
      "x": -390, 
      "y": 130 
     }, 
     "z": 0, 
     "embeds": [] 
     }, 
     "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": { 
     "source": { 
      "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3" 
     }, 
     "target": { 
      "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" 
     }, 
     "z": 1 
     } 
    } 
    }, 
    "Resources": { 
    "TestGroup": { 
     "Type": "AWS::IAM::Group", 
     "Properties": {}, 
     "Metadata": { 
     "AWS::CloudFormation::Designer": { 
      "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" 
     } 
     }, 
     "Condition": "" 
    } 
    }, 
    "Parameters": {}, 
    "Outputs": { 
    "GroupNameOut": { 
     "Description": "The Group Name", 
     "Value": { 
     "Ref": "TestGroup" 
     }, 
     "Export": { 
     "Name": "Exported-GroupName" 
     } 
    } 
    } 
} 

Sau đó tạo một Template người dùng mà cần nhóm.

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Metadata": { 
    "AWS::CloudFormation::Designer": { 
     "ac295134-9e38-4425-8d20-2c50ef0d51b3": { 
     "size": { 
      "width": 60, 
      "height": 60 
     }, 
     "position": { 
      "x": -450, 
      "y": 130 
     }, 
     "z": 0, 
     "embeds": [], 
     "isrelatedto": [ 
      "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" 
     ] 
     }, 
     "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": { 
     "source": { 
      "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3" 
     }, 
     "target": { 
      "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" 
     }, 
     "z": 1 
     } 
    } 
    }, 
    "Resources": { 
    "TestUser": { 
     "Type": "AWS::IAM::User", 
     "Properties": { 
     "UserName": { 
      "Ref": "UserNameParam" 
     }, 
     "Groups": [ 
      { 
      "Fn::ImportValue": "Exported-GroupName" 
      } 
     ] 
     }, 
     "Metadata": { 
     "AWS::CloudFormation::Designer": { 
      "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3" 
     } 
     } 
    } 
    }, 
    "Parameters": { 
    "UserNameParam": { 
     "Default": "testerUser", 
     "Description": "Username For Test", 
     "Type": "String", 
     "MinLength": "1", 
     "MaxLength": "16", 
     "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*", 
     "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters." 
    } 
    }, 
    "Outputs": { 
    "UserNameOut": { 
     "Description": "The User Name", 
     "Value": { 
     "Ref": "TestUser" 
     } 
    } 
    } 
} 

Bạn sẽ nhận được

No export named Exported-GroupName found. Rollback requested by user.

nếu chạy tài khoản không có Nhóm tìm thấy xuất khẩu.

Sau đó, bạn có thể sử dụng phương pháp ngăn xếp lồng nhau.

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Metadata": { 
    "AWS::CloudFormation::Designer": { 
     "66470873-b2bd-4a5a-af19-5d54b11f48ef": { 
     "size": { 
      "width": 60, 
      "height": 60 
     }, 
     "position": { 
      "x": -815, 
      "y": 169 
     }, 
     "z": 0, 
     "embeds": [] 
     }, 
     "ed1de011-f1bb-4788-b63e-dcf5494d10d1": { 
     "size": { 
      "width": 60, 
      "height": 60 
     }, 
     "position": { 
      "x": -710, 
      "y": 170 
     }, 
     "z": 0, 
     "dependson": [ 
      "66470873-b2bd-4a5a-af19-5d54b11f48ef" 
     ] 
     }, 
     "c978f2d9-3fb2-4420-b255-74941f10a28a": { 
     "source": { 
      "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1" 
     }, 
     "target": { 
      "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef" 
     }, 
     "z": 1 
     } 
    } 
    }, 
    "Resources": { 
    "GroupStack": { 
     "Type": "AWS::CloudFormation::Stack", 
     "Properties": { 
     "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestGroup.json" 
     }, 
     "Metadata": { 
     "AWS::CloudFormation::Designer": { 
      "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef" 
     } 
     } 
    }, 
    "UserStack": { 
     "Type": "AWS::CloudFormation::Stack", 
     "Properties": { 
     "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestUserFindsGroup.json" 
     }, 
     "Metadata": { 
     "AWS::CloudFormation::Designer": { 
      "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1" 
     } 
     }, 
     "DependsOn": [ 
     "GroupStack" 
     ] 
    } 
    } 
} 

Thật không may bạn vẫn có thể xóa chồng người dùng mặc dù nó được thực hiện bởi MultiStack trong ví dụ này nhưng với chính sách xóa và những thứ khác nó có thể hữu ích.

Sau đó, bạn chỉ cập nhật các ngăn xếp khác nhau mà nó tạo và bạn sẽ không thực hiện nhiều ngăn xếp nếu bạn đang sử dụng lại một nhóm.

Nếu không, bạn sẽ xem API và tập lệnh theo các hương vị khác nhau.

Các vấn đề liên quan