나의 시나리오
CloudFormation 템플릿에는 단일 VPC, 퍼블릭 서브넷 및 프라이빗 서브넷이 있습니다. 퍼블릭 서브넷에는 인스턴스에 Amazon NAT AMI가 있습니다. 프라이빗 서브넷에는 내부 LoadBalancer 뒤에 자동 확장 그룹이 있습니다. 이 autoScaling 그룹에는 데모 웹 페이지와 함께 httpd를 설치하기 위한 LaunchConfig가 있습니다.
문제
이 프라이빗 서브넷 Autoscaling 그룹에서 시작된 EC2 인스턴스는 웹 서버를 설치하지 않습니다. 이로 인해 ELB가 실패하고 전체 cloudformation 스택이 롤백됩니다. 그러나 생성 후에 SSH를 통해 인터넷 웹 페이지를 성공적으로 가져오고 yum install httpd를 수동으로 사용할 수 있습니다. 이는 ELB 검사를 만족시켜서 cloudFormation 스택을 수정합니다. /var/log/cloudinit-output.log에는 인스턴스가 초기화 중에 Amazon yum 리포지토리를 확인할 수 없다고 나와 있습니다.
NAT 인스턴스가 완전히 가동되어 작동하기 전에 새 EC2 인스턴스에서 LaunchConfig가 시작되기 때문에 이러한 현상이 발생할 수 있다는 느낌이 듭니다. AutoScaling 그룹에 'DependsOn': 'NATInstance'를 추가하려고 시도했지만 문제가 해결되지 않았습니다.
도울 수 있니?
답변1
Cloudwatcher의 대답은 정확했습니다. 하지만 나중에 비슷한 문제가 있는 다른 사람을 위해 자세히 설명하고 싶습니다.
CloudFormation 템플릿의 'DependsOn' 속성은 리소스가 완료되었다는 신호를 보낼 때 충족됩니다. 기본적으로 나는 이것이 Amazon이 리소스를 생성했을 때라고 믿습니다. 내 예에서는 NAT 인스턴스가 실제로 생성되었으며, 이때 인스턴스가 신호를 보내고 있었습니다. 그러나 인스턴스 내부의 구성 및 설정이 완료되지 않았으므로 다른 인스턴스가 NAT를 사용하려고 시도하기 전에는 NAT가 작동하지 않는 상태로 유지되었습니다. 다른 인스턴스는 NAT 인스턴스를 통해 인터넷에 연결할 수 없어 실패했습니다.
기본 신호를 직접 수동으로 무시할 수 있습니다. 이는 귀하가 작업을 수행한 다음 작업이 완료되면 신호를 보낼 수 있음을 의미합니다. 그러면 이에 의존하는 다른 모든 리소스에 대한 'DependsOn' 속성이 제대로 작동합니다. EC2 인스턴스 내에서 일부 Amazon 도우미 스크립트, 특히 'cfn-init' 및 'cfn-signal'을 사용하여 이를 수행합니다. EC2 인스턴스(또는 자동 확장 그룹)의 'UserData' 속성에서 aws-cfn-bootstrap을 설치하여 스크립트(또는 사용 중인 패키지 관리자)를 가져옵니다. 그런 다음 UserData 내에서 초기화 단계를 수행하고 완료되면 cfn-signal을 사용하여 리소스가 완료되었음을 알릴 수 있습니다. 내 예는 다음과 같습니다.
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -xe\n",
"yum update -y aws-cfn-bootstrap\n",
"wget <<URL FOR YOUR INIT BASH SCRIPT HERE>> -O - | bash\n",
"/opt/aws/bin/cfn-init -v ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource <RESOURCE TO SIGNAL HERE> ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"/opt/aws/bin/cfn-signal -e $? ",
" --stack ", { "Ref" : "AWS::StackName" },
" --resource <RESOURCE TO SIGNAL HERE> ",
" --region ", { "Ref" : "AWS::Region" }, "\n"
]]}}
이것이 누군가에게 도움이 되기를 바랍니다.
답변2
보안 그룹 및 트래픽 허용과 관련하여 고려해야 할 몇 가지 사항이 있습니다. 그러나 NAT와 관련하여 NAT 시작 구성에서 다음을 실행하지 않는지 확인하십시오.
/opt/aws/bin/cfn-signal
설정 및 통과 스크립트가 완료될 때까지. NAT가 "DependsOn"인 경우 CloudFormation 스택이 이 신호를 수신할 때까지 계속되지 않습니다.
[편집] 오늘(2015-12-18) 이후에 누군가 이 내용을 보고 있다면 AWS에서 제공하는 NAT 관리 서비스를 이동하는 것을 고려해야 합니다.https://aws.amazon.com/about-aws/whats-new/2015/12/introducing-amazon-vpc-nat-gateway-a-managed-nat-service/