AWS CloudFormation 스택에서 Fn::ImportValue를 사용할 때 "No Export named XYZ found" 오류가 발생합니다.
해결 방법
사전 요구 사항:
- 값을 내보낼 스택에 대해서는 CloudFormation 템플릿의 출력 섹션에서 Export: 플래그를 사용합니다.
- Use Fn::ImportValue on the stack that references the exported value.
값 가져오기 및 내보내기 사용 시 스택 참조 관련 문제를 해결하려면 다음 조치를 취하세요.
중첩 스택을 사용하는 경우 DependsOn
기본적으로 CloudFormation은 모든 중첩 스택을 병렬로 생성합니다. CloudFormation이 하위 스택을 병렬로 생성하고 하위 스택이 다른 스택에서 출력을 가져오는 경우 스택 생성이 실패할 수 있습니다. 내보내기 값을 자식 스택이 Fn::ImportValue를 사용하여 가져올 때까지 사용할 수 없을 수 있습니다.
이 문제를 해결하려면 DependsOn 속성을 사용하세요. 이 속성은 Fn::ImportValue를 사용하는 스택과 Export: 속성을 사용하여 값을 내보내는 스택 간에 명시적 종속성을 만듭니다. 이렇게 하면 CloudFormation은 값을 내보내는 스택을 생성한 후에만 Fn::ImportValue를 사용하는 스택을 생성합니다.
예시: 중첩 스택에서 ChildStack01은 아웃풋 섹션에 값을 익스포트하고, ChildStack02는 Fn::ImportValue를 사용하여 ChildStack01에서 값을 임포트합니다. 다음 YAML 템플릿에서 ChildStack02는 DependsOn 속성을 사용합니다:
AWSTemplateFormatVersion: 2010-09-09Resources:
ChildStack01:
Type: 'AWS::CloudFormation::Stack'
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/VPC.template'
TimeoutInMinutes: '60'
ChildStack02:
Type: 'AWS::CloudFormation::Stack'
DependsOn: ChildStack01
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/Subnet.template'
TimeoutInMinutes: '60'
참고: 크로스 스택 참조의 경우, Fn::ImportValue를 사용하여 다른 템플릿에서 값을 가져옵니다. 동일한 스택 내 참조의 경우 Fn::Ref 및 Fn::GetAtt를 사용하여 지정된 매개변수 또는 리소스 값을 반환합니다.
가져오기 스택에서 내보내기 이름을 확인합니다.
내보내기 값이 정확한지 확인하려면 다음 조치를 취하세요:
- 내보내기 이름이 AWS 계정에 나열되어 있는지 확인합니다.
- 한 스택에서 다른 스택으로 내보내기 이름을 가져올 때는 두 스택에서 동일한 내보내기 이름을 사용하고 있는지 확인하세요.
- Fn::ImportValue를 사용하여 스택을 생성하기 전에 내보내기 및 가져오기 스택의 스택 구성 확인 섹션을 참조하세요.
내보낸 값이 값을 가져오는 곳과 동일한 AWS 리전 또는 동일한 계정에 있는지 확인합니다.
크로스 스택 참조는 단일 계정 및 리전 내에서만 사용할 수 있습니다. 그러나 동일한 계정 및 지역에 있는 다른 스택은 내보낸 값만 가져올 수 있습니다.
이 문제를 해결하려면 Fn::ImportValue를 사용하여 스택을 만들기 전에 내보내기 및 가져오기 스택의 스택 구성 확인 섹션을 참조하세요.
내보낸 값이 스택에서 가져오기 전에 생성되거나 게시되었는지 확인하세요.
중첩되지 않은 스택의 경우 값을 내보내는 스택을 먼저 배포해야 합니다. 스택은 Create_Complete 또는 Update_Complete 상태여야 합니다.
Fn::ImportValue를 사용하여 스택을 생성하기 전에 내보내기 및 가져오기 스택의 스택 구성 확인 섹션을 참조하세요.
내보내기 및 가져오기 스택의 스택 구성을 확인합니다.
내보내기 값을 가져올 준비가 되었는지 확인하려면 CloudFormation 콘솔 또는 AWS CLI(AWS 명령줄 인터페이스)를 사용하세요.
참고: 가져오기 및 내보내기 스택은 동일한 지역 및 계정에 있어야 합니다.
CloudFormation 콘솔을 사용하려면 다음 단계를 완료하세요:
- CloudFormation 콘솔을 엽니다.
- 탐색 창에서 내보내기를 선택합니다.
- 스택의 내보내기 값이 나열되었는지 확인합니다.
AWS CLI를 사용하려면 다음 단계를 완료하세요.
-
사용 가능한 내보내기를 나열하려면 다음 list-exports 명령을 실행하세요:
aws cloudformation list-exports --region us-east-1
참고: us-east-1을 원하는 리전으로 바꾸세요.
-
출력에서 내보내기의 Name 값이 Fn::ImportValue 값과 동일한지 확인합니다.
출력은 다음 예와 비슷합니다.
aws cloudformation list-exports --region us-east-1 --output yamlExports:
- ExportingStackId: arn:aws:cloudformation:us-east-1:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800
Name: private-vpc-subnet-a
Value: subnet-01a234bcdefghij56
**참고:AWS CLI 명령을 실행할 때 오류가 발생하면, **AWS CLI 오류 문제 해결을 참조하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
스택에서 출력값을 가져온 후에는 출력값을 내보내는 스택을 삭제하거나 내보낸 출력값을 수정할 수 없습니다. 내보내기 스택을 삭제하거나 출력 값을 수정하려면 먼저 모든 가져오기를 제거해야 합니다. 해결 방법을 사용하는 방법에 대한 자세한 내용은 AWS 시스템 관리자 매개 변수 저장소에서 매개 변수를 사용하여 CloudFormation 스택 간에 값을 공유하는 방법을 참조하세요. 내보내기 이름은 지역 내에서 고유해야 합니다.
정보를 가져오는 스택의 가져오기 문은 이 예제와 비슷하게 보입니다:
Resources:
WebServerInstance:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: t2.micro
ImageId: ami-a1b23456
NetworkInterfaces:
AssociatePublicIpAddress: 'true'
DeviceIndex: '0'
DeleteOnTermination: 'true'
SubnetId: Fn::ImportValue: 'private-vpc-subnet-a'