DependsOn
속성
DependsOn
속성을 사용하여 특정 리소스가 다른 리소스 다음에 생성되도록 지정할 수 있습니다. 리소스에 DependsOn
속성을 추가한 경우 DependsOn
속성에 지정된 리소스가 생성된 후에만 해당 리소스가 생성됩니다.
중요
종속 스택은 또한 대상 속성 !Ref
, !GetAtt
및 !Sub
형식의 암시적 종속성을 갖습니다. 예를 들어, 리소스 A의 속성에서 리소스 B에 대한 !Ref
을 사용할 경우 다음 규칙이 적용됩니다.
-
리소스 B가 리소스 A보다 먼저 생성됩니다.
-
리소스 A가 리소스 B보다 먼저 삭제됩니다.
-
리소스 B가 리소스 A보다 먼저 업데이트됩니다.
DependsOn
속성을 모든 리소스와 함께 사용할 수 있습니다. 다음은 몇 가지 일반적인 사용 사례입니다.
-
대기 조건이 적용되는 시간을 결정합니다. 자세한 내용은 CloudFormation 템플릿에서 대기 조건 생성 단원을 참조하십시오.
-
특정 순서로 생성하거나 삭제해야 하는 리소스에 대한 종속성을 선언합니다. 예를 들어, VPC의 일부 리소스에 대해 게이트웨이 연결에 대한 종속성을 명시적으로 선언해야 합니다. 자세한 내용은 DependsOn 속성이 필요한 경우 단원을 참조하십시오.
-
리소스를 생성, 업데이트 또는 삭제할 때 기본 병렬 처리를 재정의합니다. AWS CloudFormation에서는 최대한 병렬로 리소스를 생성, 업데이트 및 삭제합니다. 또한 템플릿에서 병렬화할 수 있는 리소스와 다른 작업을 먼저 완료해야 하는 종속성이 있는 리소스를 자동으로 결정합니다.
DependsOn
을 사용하여 기본 병렬화를 재정의하고 CloudFormation을 이러한 리소스에 대해 지정된 순서로 작동하도록 지시하는 종속성을 명시적으로 지정할 수 있습니다.
참고
스택 업데이트 중 업데이트된 리소스에 종속되는 리소스는 자동으로 업데이트됩니다. CloudFormation에서는 자동으로 업데이트된 리소스를 변경하지 않지만, 스택 정책이 이러한 리소스와 연결되어 있는 경우 계정에 해당 리소스를 업데이트할 권한이 있어야 합니다.
구문
DependsOn
속성은 단일 문자열 또는 문자열 목록을 가져올 수 있습니다.
"DependsOn" : [
String, ...
]
예제
다음 템플릿에는 myDB를 지정하는 DependsOn
속성을 가진 AWS::EC2::Instance 리소스(AWS::RDS::DBInstance)가 포함되어 있습니다. CloudFormation에서 이 스택을 생성할 때 myDB를 먼저 생성한 다음 Ec2Instance를 생성합니다.
JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-0ff8a91507f77f867" }, "us-west-1" : { "AMI" : "ami-0bdb828fd58c52235" }, "eu-west-1" : { "AMI" : "ami-047bb4163c506cd98" }, "ap-northeast-1" : { "AMI" : "ami-06cd52961ce9f0d85" }, "ap-southeast-1" : { "AMI" : "ami-08569b978cc4dfa10" } } }, "Resources" : { "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId": { "Fn::FindInMap": [ "RegionMap", { "Ref": "AWS::Region" }, "AMI" ] } }, "DependsOn" : "myDB" }, "myDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.t2.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : "MyName", "MasterUserPassword" : "MyPassword" } } } }
YAML
AWSTemplateFormatVersion: '2010-09-09' Mappings: RegionMap: us-east-1: AMI: ami-0ff8a91507f77f867 us-west-1: AMI: ami-0bdb828fd58c52235 eu-west-1: AMI: ami-047bb4163c506cd98 ap-northeast-1: AMI: ami-06cd52961ce9f0d85 ap-southeast-1: AMI: ami-08569b978cc4dfa10 Resources: Ec2Instance: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - RegionMap - Ref: AWS::Region - AMI DependsOn: myDB myDB: Type: AWS::RDS::DBInstance Properties: AllocatedStorage: '5' DBInstanceClass: db.t2.small Engine: MySQL EngineVersion: '5.5' MasterUsername: MyName MasterUserPassword: MyPassword
DependsOn
속성이 필요한 경우
VPC 게이트웨이 연결
VPC의 일부 속성에는 게이트웨이(인터넷 또는 VPN 게이트웨이)가 필요합니다. CloudFormation 템플릿이 VPC, 게이트웨이, 게이트웨이 연결을 정의할 경우 게이트웨이가 필요한 모든 리소스는 게이트웨이 연결에 종속됩니다. 예를 들어, 퍼블릭 IP 주소가 있는 Amazon EC2 인스턴스는 VPC
및 InternetGateway
리소스 또한 동일한 템플릿에서 선언될 경우 VPC-게이트웨이 연결에 종속됩니다.
현재 다음 리소스는 연결된 퍼블릭 IP 주소가 있고 VPC에 있을 경우에 VPC-게이트웨이 연결에 종속됩니다.
-
Auto Scaling 그룹
-
Amazon EC2 인스턴스
-
Elastic Load Balancing 로드 밸런서
-
탄력적 IP 주소
-
Amazon RDS 데이터베이스 인스턴스
-
인터넷 게이트웨이를 포함하는 Amazon VPC 경로
VPN 게이트웨이가 있는 경우 VPN 게이트웨이 경로는 VPC 게이트웨이 연결에 따라 다르게 전파됩니다.
다음 코드는 샘플 게이트웨이 연결과 게이트웨이 연결에 종속되는 Amazon EC2 인스턴스를 보여줍니다.
JSON
"GatewayToInternet" : { "Type" : "AWS::EC2::VPCGatewayAttachment", "Properties" : { "VpcId" : { "Ref" : "VPC" }, "InternetGatewayId" : { "Ref" : "InternetGateway" } } }, "EC2Host" : { "Type" : "AWS::EC2::Instance", "DependsOn" : "GatewayToInternet", "Properties" : { "InstanceType" : { "Ref" : "EC2InstanceType" }, "KeyName" : { "Ref" : "KeyName" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "EC2InstanceType" }, "Arch" ] } ] }, "NetworkInterfaces" : [ { "GroupSet" : [ { "Ref" : "EC2SecurityGroup" } ], "AssociatePublicIpAddress" : "true", "DeviceIndex" : "0", "DeleteOnTermination" : "true", "SubnetId" : { "Ref" : "PublicSubnet" } } ] } }
YAML
GatewayToInternet: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: Ref: VPC InternetGatewayId: Ref: InternetGateway EC2Host: Type: AWS::EC2::Instance DependsOn: GatewayToInternet Properties: InstanceType: Ref: EC2InstanceType KeyName: Ref: KeyName ImageId: Fn::FindInMap: - AWSRegionArch2AMI - Ref: AWS::Region - Fn::FindInMap: - AWSInstanceType2Arch - Ref: EC2InstanceType - Arch NetworkInterfaces: - GroupSet: - Ref: EC2SecurityGroup AssociatePublicIpAddress: 'true' DeviceIndex: '0' DeleteOnTermination: 'true' SubnetId: Ref: PublicSubnet
Amazon ECS 서비스 및 Auto Scaling 그룹
Auto Scaling 또는 Amazon Elastic Compute Cloud(Amazon EC2)를 사용하여 Amazon ECS 클러스터에 대한 컨테이너 인스턴스를 생성할 경우 다음 코드 조각과 같이 Amazon ECS 서비스 리소스가 Auto Scaling 그룹 또는 Amazon EC2 인스턴스에 종속해야 합니다. 그러면 CloudFormation에서 Amazon ECS 서비스를 생성하기 이전에 컨테이너 인스턴스가 사용 가능하고 Amazon ECS 클러스터에 연결됩니다.
JSON
"service": { "Type": "AWS::ECS::Service", "DependsOn": [ "ECSAutoScalingGroup" ], "Properties" : { "Cluster": { "Ref": "ECSCluster" }, "DesiredCount": "1", "LoadBalancers": [ { "ContainerName": "simple-app", "ContainerPort": "80", "LoadBalancerName" : { "Ref" : "EcsElasticLoadBalancer" } } ], "Role" : { "Ref":"ECSServiceRole" }, "TaskDefinition" : { "Ref":"taskdefinition" } } }
YAML
service: Type: AWS::ECS::Service DependsOn: - ECSAutoScalingGroup Properties: Cluster: Ref: ECSCluster DesiredCount: 1 LoadBalancers: - ContainerName: simple-app ContainerPort: 80 LoadBalancerName: Ref: EcsElasticLoadBalancer Role: Ref: ECSServiceRole TaskDefinition: Ref: taskdefinition
IAM 역할 정책
AWS를 추가로 호출하는 리소스에는 서비스 역할이 필요하며, 이를 통해 서비스가 사용자를 대신하여 AWS를 호출할 수 있습니다. 예를 들어, AWS::CodeDeploy::DeploymentGroup
리소스는 CodeDeploy에서 애플리케이션을 인스턴스에 배포하도록 권한을 부여하는 서비스 역할이 필요합니다. 단일 템플릿을 사용하여 서비스 역할, 역할의 정책(AWS::IAM::Policy
또는 AWS::IAM::ManagedPolicy
리소스), 역할을 사용하는 리소스 등을 정의하는 경우 리소스가 역할의 정책에 종속하도록 종속성을 추가합니다. 이 종속성은 리소스의 수명 주기 전반에서 정책을 사용할 수 있도록 해줍니다.
예를 들어, 배포 그룹 리소스, 서비스 역할 및 역할의 정책을 포함하는 템플릿이 있다고 가정합니다. 스택을 생성할 때 CloudFormation에서는 역할 정책이 생성될 때까지 배포 그룹을 생성하지 않습니다. 종속성이 없을 경우 CloudFormation에서는 역할 정책이 생성되기 이전에 배포 그룹 리소스를 생성할 수 있습니다. 이 경우 권한이 부족하므로 배포 그룹이 생성되지 않습니다.
역할에 포함된 정책이 있는 경우 종속성을 지정하지 마세요. CloudFormation은 역할과 해당 정책을 동시에 생성합니다.