Có thể buộc tái tạo EC2 :: Instance hoặc RDS :: DBInstance trong đám mây amazon không?


16

Bạn có thể buộc tạo lại phiên bản EC2 hoặc RDS bằng cách sử dụng ngăn xếp đám mây không?

Ngăn xếp của tôi bị kẹt ở một điểm mà chỉ cần phá hủy và tạo tài nguyên sẽ sửa nó, thay vào đó tôi phải xóa toàn bộ ngăn xếp để tiếp tục công việc.

biên tập:

Vấn đề này đánh tôi hai lần. Đầu tiên tôi tạo một AWS :: RDS :: Instance với một số giá trị mặc định và sau đó cố gắng hạ cấp nó xuống "EngineVersion": "5.5". Việc thay đổi điều này được cho là xảy ra với một số gián đoạn, nhưng các trường hợp mysql có thể bị hạ cấp từ 5.6 xuống 5.5 vì vậy ngăn xếp được để ở trạng thái UPDATE_FAILED và tôi không thể tạo lại RDS mà không cần một thủ thuật khó chịu.

Một sự cố khác là tôi có một số "AWS :: EC2 :: Instance" tải xuống và thực thi một tập lệnh từ "UserData" rõ ràng nếu Y thay đổi tập lệnh đã tải xuống, tôi phải gửi lại ví dụ và không có cách nào để làm như vậy. Một lần nữa tôi sử dụng thủ thuật khó chịu tương tự để tái tạo lại máy.

Thủ thuật khó chịu:

Thay vì sử dụng một nhóm tự động hóa của một máy, tôi đã giải quyết cả hai vấn đề thay đổi vùng khả dụng trong các thuộc tính ... nhưng để lại cho tôi một hương vị xấu


Cần thêm thông tin để trả lời. Các trường hợp của bạn đóng băng khi khởi động? Có một dịch vụ trở nên không đáp ứng? Nếu bạn đang tìm cách tự tạo lại một thể hiện EC2, bạn có thể tạo một nhóm tự động mở rộng với một thể hiện. Khi bạn chấm dứt thể hiện, một cái khác sẽ được tạo.
Edwin

chỉnh sửa để làm rõ. Tôi cũng hỏi ở đây: forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
hữu thần

Điều này không trả lời trực tiếp câu hỏi của bạn, nhưng để chạy lại các tập lệnh UserData khi thay đổi, bạn có thể xem xét cfn-hup: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/iêu
Reed Kraft-Murphy

Câu trả lời:


10

Đối với các phiên bản EC2 được lưu trữ trong kho lưu trữ, một mẹo là thêm nhận xét vào tập lệnh dữ liệu người dùng có chứa số phiên bản, ngày hoặc tương tự, sau đó thay đổi bất cứ khi nào bạn muốn tạo lại phiên bản:

{
    "Resources" : {
        "MyEC2Instance" : {
            "Type" : "AWS::EC2::Instance",
            "Properties" : {
                // ... other properties ...
                "UserData": { 
                    "Fn::Base64" : {
                        "Fn::Join" : [ ":", [
                        "#!/bin/bash\n",
                        "# Version: 1.0\n",
                        // ... rest of user data ...
                    ]]}
            }
        }
    }
}

Mọi thay đổi UserDatasẽ khiến cho thể hiện được thay thế (nghĩa là được tạo lại). Tuy nhiên, hành vi của tập lệnh dữ liệu người dùng phải giống nhau, vì sửa đổi duy nhất là một nhận xét. Lưu ý rằng điều này không hoạt động cho các trường hợp được hỗ trợ bởi EBS.

Đối với RDS, bạn có thể chụp ảnh chụp nhanh DB của phiên bản RDS hiện tại, sau đó sửa đổi mẫu của bạn để sử dụng ảnh chụp nhanh đó với DBSnapshotIdentifier:

{
    "Resources" : {
        "MyDB" : {
        "Type" : "AWS::RDS::DBInstance",
        "Properties" : {
            // ... other properties ...
            "DBSnapshotIdentifier": "<db snapshot ID>"
        }
    }    
}

Bất cứ khi nào DBSnapshotIdentifierđược thay đổi, thể hiện cơ sở dữ liệu sẽ được thay thế. Sử dụng ảnh chụp nhanh cũng sẽ cho phép bạn giữ dữ liệu từ khi ảnh chụp được thực hiện. (Nếu bạn muốn xóa sạch dữ liệu, bạn có thể tạo một ảnh chụp nhanh trống và chuyển dữ liệu đó làm đầu vào. Hoặc xóa và tạo lại toàn bộ ngăn xếp CloudFormation.)

Một cách tiếp cận chung hơn là thay đổi tên logic của tài nguyên. Từ Sửa đổi Mẫu ngăn xếp trong tài liệu CloudFormation:

Đối với hầu hết các tài nguyên, việc thay đổi tên logic của tài nguyên tương đương với việc xóa tài nguyên đó và thay thế bằng tài nguyên mới. Bất kỳ tài nguyên nào khác phụ thuộc vào tài nguyên được đổi tên cũng cần phải được cập nhật và có thể khiến chúng bị thay thế. Các tài nguyên khác yêu cầu bạn cập nhật một thuộc tính (không chỉ tên logic) để kích hoạt cập nhật.


Có vẻ như giải pháp duy nhất là thực hiện "thủ đoạn bẩn thỉu" Tôi đã đạt được một giải pháp tương tự (buộc thay đổi vùng khả dụng) một thời gian sau khi hỏi :)
theist

4
Chỉ muốn chỉ ra rằng cá thể được thay thế và do đó UserData được thực thi khi cá thể EC2 được lưu trữ lại. Nếu được EBS hỗ trợ, việc thay đổi UserData sẽ chỉ khiến cá thể khởi động lại và UserData không được thực hiện lại. Bạn có thể sử dụng cfn-hup để chạy UserData ngay cả trong trường hợp này, nhưng trường hợp vẫn giữ nguyên.
Kaitsu

@Kaitsu: Cảm ơn, đó là một sự làm rõ rất có giá trị. Tôi cập nhật câu trả lời của tôi cho phù hợp.
markusk

@Kaitsu nhưng nếu bạn chạy lại tập lệnh theo cách thủ công (nằm ở / var / lib / cloud / instance / scripts / part-001), bạn phải đảm bảo tập lệnh được bảo vệ để chạy cùng một lệnh nhiều lần :(
c24w

1

Nếu bạn đặt nó vào AutoScalinggroup, bạn có thể chỉnh sửa AutoScalinggroup min / max / default thành 0, ngay sau khi nó bắt đầu hủy phiên bản cũ, bạn có thể đặt min / max / default thành 1/1/1 và uy tín: ví dụ mới.


0

Nếu EC2 của bạn nằm trong AutoScalinggroup, bạn có thể đặt thuộc AutoScalingGroupNametính có số phiên bản trong đó.

Mỗi khi bạn thay đổi số phiên bản CFN đó sẽ: 1. tạo một nhóm tự động mở rộng quy mô mới và quay các trường hợp mong muốn 2. tiêu diệt các thể hiện trong nhóm tự động thay đổi tỷ lệ cũ và xóa nó

Đây là một đoạn mã từ ngăn xếp của tôi, nơi tôi sử dụng kỹ thuật này để buộc một số lượng lớn máy EC2 tạo lại và tự động kéo phần mềm mới từ S3.

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.