AWS Cloud Development Kit(AWS CDK) L3/L2 구성과 AWS CloudFormation 간에 차이가 있을 때 리소스 속성 값을 수정하려고 합니다.
간략한 설명
경우에 따라 상위 수준 구성(L3 및 L2)에는 수정할 수 없는 리소스 속성이 있습니다. 이 문제를 해결하려면 AWS CDK 이스케이프 해치를 사용하여 더 낮은 수준의 추상화로 이동하고 리소스 속성 값을 수정하십시오.
AWS CDK Python을 사용하는 Amazon Virtual Private Cloud(Amazon VPC) 예제:
vpc = ec2.Vpc(self, "MyCDKVPC",
max_azs=2,
cidr='60.0.0.0/16',
subnet_configuration=[
ec2.SubnetConfiguration(
name="public",
subnet_type=ec2.SubnetType.PUBLIC,
cidr_mask=24,
),
ec2.SubnetConfiguration(
name="private",
subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT,
cidr_mask=24,
)
]
)
위의 예제 Amazon VPC는 L2 구성 **aws_cdk.aws_ec2.Vpc**를 사용하여 정의되었습니다. 이 구성에는 CidrBlock이 60.0.0.0/16으로 설정된 두 개의 가용 영역(AZ)이 있습니다. 예제 Amazon VPC에는 두 AZ에 분산된 두 개의 PublicSubnets과 두 개의 PrivateSubnets도 포함되어 있습니다.
AWS: :EC2: :서브넷 리소스를 확인하는 CloudFormation을 생성할 때 CidrBlock은 첫 번째 IP 범위인 60.0.0.0/24에서 시작되며 수정할 수 없습니다.
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: 60.0.0.0/24
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: 60.0.1.0/24
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: 60.0.2.0/24
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: 60.0.3.0/24
이 문제를 해결하려면 다음 단계를 수행하십시오.
- Amazon VPC 내에서 생성된 서브넷을 검색합니다(L2 PublicSubnet 구성 및 L2 PrivateSubnet 구성).
- L2 구성에서 AWS CDK 이스케이프 해치 node.default_child를 사용하고 L1 CfnSubnet 리소스로 캐스팅합니다.
- 직접 또는 원시 재정의를 사용하여 cidr_block을 수정합니다.
- CloudFormation 템플릿에서 cidr_block 업데이트를 확인합니다.
해결 방법
AWS CDK 이스케이프 해치를 사용하여 PublicSubnets 또는 PrivateSubnets에 대한 하위 추상화 계층의 CidrBlock 값을 수정하려면 다음 단계를 수행하십시오.
중요: 다음 단계는 PublicSubnets에 적용됩니다. PrivateSubnets에 적용하려면 PublicSubnet의 모든 인스턴스를 PrivateSubnet으로 바꿉니다.
1. vpc.public_subnets 속성을 사용하여 Amazon VPC에서 PublicSubnets 목록을 검색합니다.
public_subnets = vpc.public_subnets
참고: 생성된 목록 내의 각 요소는 L2 PublicSubnet 구성입니다. 다음 예제 출력을 참조하십시오.
########## confirm public_subnets is a L2 construct ##########
print(public_subnets)
# printout: [<aws_cdk.aws_ec2.PublicSubnet object at 0x7f3f48acb490>, <aws_cdk.aws_ec2.PublicSubnet object at 0x7f3f48acb050
2. 원하는 L2 구성(이 예제에서는 aws_cdk.aws_ec2.PublicSubnet)에 node.default_child 특성을 사용합니다. 그런 다음, L1 CfnSubnet 리소스(이 예제에서는 aws_cdk.aws_ec2.CfnSubnet)로 캐스팅합니다.
########## confirm cfn_public_subnet is a L1 construct ##########
for public_subnet in public_subnets:
cfn_public_subnet = public_subnet.node.default_child
print(cfn_public_subnet)
# printout: <aws_cdk.aws_ec2.CfnSubnet object at 0x7f3f48acb710>
# printout: <aws_cdk.aws_ec2.CfnSubnet object at 0x7f3f48acb950>
3. L1 CfnSubnet 리소스에 액세스한 후 다음 방법 중 하나를 사용하여 L1 CfnSubnet 구성에서 CidrBlock을 수정하십시오.
- cidr_block을 직접 수정
- 원시 재정의를 사용하여 cidr_block 수정
직접 또는 원시 재정의를 사용하는 cidr_block 수정 예:
public_subnets = vpc.public_subnets
public_subnet_index = 0
for public_subnet in public_subnets:
cfn_public_subnet = public_subnet.node.default_child
########### 1) modify the cidr_block property directly ###########
cfn_public_subnet.cidr_block = "60.0." + str(public_subnet_index + example_start_value) + ".0/24")
########### 2) modify the cidr_block by using raw overrides ###########
cfn_public_subnet.add_property_override("CidrBlock", "60.0." + str(public_subnet_index + example_start_value) + ".0/24")
public_subnet_index += 1
중요: example_start_value를 지정한 값으로 바꿉니다. 예를 들어, 60.0.100.0/24에서 시작하도록 public_subnet을 수정하려면 example_start_value를 100으로 설정합니다.
4. cdk synth 명령을 실행하여 새로 생성된 CloudFormation 템플릿의 AWS::EC2::Subnet 리소스 내에서 CIDRBlock 업데이트를 확인합니다.
cdk synth
예제 출력:
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: 60.0.100.0/24 <---
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: 60.0.101.0/24
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: <example_custom_value>/24
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
...
CidrBlock: <example_custom_value>/24
관련 정보
PrivateSubnet
vpc.private_subnets