Amazon Cloudformation에서 EC2 :: Instance 또는 RDS :: DBInstance를 강제로 다시 생성 할 수 있습니까?


16

Cloudformation 스택을 사용하여 EC2 또는 RDS 인스턴스를 강제로 다시 생성 할 수 있습니까?

내 스택은 작업을 계속하기 위해 전체 스택을 삭제 해야하는 대신 단순히 리소스를 파괴하고 생성하는 것이 문제를 해결하는 지점에 갇혀 있습니다.

편집하다:

이 문제는 두 번 나에게 맞았다. 먼저 몇 가지 기본값으로 AWS :: RDS :: Instance를 생성 한 다음 "EngineVersion": "5.5"로 다운 그레이드하려고했습니다. 이것을 변경하면 약간의 중단으로 발생할 수 있지만 mysql 인스턴스를 5.6에서 5.5로 다운 그레이드 할 수 없으므로 스택이 UPDATE_FAILED 상태로 남아있어 불쾌한 트릭없이 RDS를 다시 만들 수 없습니다.

다른 경우에는 다운로드 된 스크립트를 변경하면 인스턴스를 다시 작성해야하므로 분명히 "UserData"에서 스크립트를 다운로드하고 실행하는 여러 개의 "AWS :: EC2 :: Instance"가 있습니다. 다시 한 번 나는 엉뚱한 속임수를 사용하여 기계를 다시 만듭니다.

불쾌한 트릭 :

한 시스템의 자동 확장 그룹을 사용하는 대신 속성에서 가용 영역을 변경하는 두 가지 문제를 모두 해결했지만 맛이 좋지 않았습니다.


더 많은 정보가 필요합니다. 시작시 인스턴스가 정지됩니까? 서비스가 응답하지 않습니까? EC2 인스턴스를 수동으로 다시 생성하려는 경우 하나의 인스턴스로 자동 확장 그룹을 생성 할 수 있습니다. 인스턴스를 종료하면 다른 인스턴스가 생성됩니다.
Edwin

명확하게 편집했습니다. 또한 여기에 질문 : forums.aws.amazon.com/thread.jspa?threadID=135295&tstart=0
유신론자

이것은 귀하의 질문에 직접 대답하지는 않지만 변경된 UserData 스크립트를 다시 실행하려면 docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…를 살펴보십시오 cfn-hup.
Reed Kraft-Murphy

답변:


10

예를 들어 스토어 지원 EC2 인스턴스의 경우 트릭은 버전 번호, 날짜 등이 포함 된 사용자 데이터 스크립트에 주석을 추가 한 다음 인스턴스를 다시 만들 때마다 변경하는 것입니다.

{
    "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 ...
                    ]]}
            }
        }
    }
}

변경 UserData하면 인스턴스가 교체됩니다 (즉, 재생성). 그러나 유일한 수정은 주석이므로 사용자 데이터 스크립트의 동작은 동일해야합니다. EBS 지원 인스턴스에는이 기능이 작동하지 않습니다.

RDS 의 경우 현재 RDS 인스턴스 의 DB 스냅 샷 을 만든 다음 다음을 사용하여 해당 스냅 샷을 사용하도록 템플릿을 수정할 수 있습니다 DBSnapshotIdentifier.

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

DBSnapshotIdentifier변경 될 때마다 데이터베이스 인스턴스가 교체됩니다. 스냅 샷을 사용하면 스냅 샷을 만들 때 데이터를 유지할 수도 있습니다. (이 경우 원하는 데이터를 닦아, 비어있는 스냅 샷을 생성하고 입력으로 그 전달합니다. 또는 삭제하고 전체 CloudFormation 스택을 다시 만들 수 있습니다.)

보다 일반적인 접근 방식은 리소스의 논리적 이름을 변경하는 것입니다. 에서 스택 템플릿을 수정 CloudFormation의 문서에서 :

대부분의 리소스에서 리소스의 논리적 이름을 변경하는 것은 해당 리소스를 삭제하고 새 리소스로 바꾸는 것과 같습니다. 이름이 바뀐 리소스에 의존하는 다른 리소스도 업데이트해야하며 교체 될 수 있습니다. 다른 리소스를 사용하려면 업데이트를 트리거하기 위해 논리적 이름뿐만 아니라 속성도 업데이트해야합니다.


내가 :) 요청 후 약간의 시간 (가용 영역의 변화를 강요)과 유사한 솔루션에 도달하는 유일한 솔루션 "더러운 트릭을"할 것 같다
유신론자

4
EC2 인스턴스가 인스턴스 스토어 지원 될 때 인스턴스가 교체되어 UserData가 실행된다는 점을 지적하고 싶습니다. EBS가 지원되는 경우 UserData를 변경하면 인스턴스가 다시 시작되고 UserData가 다시 실행되지 않습니다. 이 경우에도 cfn-hup을 사용하여 UserData를 다시 실행할 수 있지만 인스턴스는 동일하게 유지됩니다.
Kaitsu

@Kaitsu : 감사합니다. 매우 귀중한 설명입니다. 이에 따라 답변을 업데이트했습니다.
markusk

@Kaitsu 그러나 스크립트를 수동으로 다시 실행하는 경우 (/ var / lib / cloud / instance / scripts / part-001에 위치) 스크립트가 동일한 명령을 여러 번 실행하는 데 방어 적
이어야합니다.

1

AutoScalingGroup에 배치하면 AutoScalingGroup min / max / default를 0으로 편집 한 다음 이전 인스턴스가 삭제되기 시작하자마자 min / max / default를 1/1/1로 설정하고 프레스토 : 새로운 인스턴스.


0

EC2가 AutoScalingGroup AutoScalingGroupName에있는 경우 버전 번호를 사용하여 속성을 설정할 수 있습니다 .

해당 버전 번호를 변경할 때마다 CFN은 다음을 수행합니다. 1. 새 자동 확장 그룹을 만들고 원하는 인스턴스를 가동시킵니다. 2. 이전 자동 확장 그룹에서 인스턴스를 종료하고 삭제합니다.

다음은이 기술을 사용하여 많은 수의 EC2 시스템이 S3에서 새 소프트웨어를 다시 생성하고 자동으로 가져 오도록 강제 실행하는 스택 코드입니다.

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
        AutoScalingGroupName: !Sub "${StackName}-${ServiceName}-${ServiceVersion}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.