今日も元気にビルドを失敗していくスタイル。
前回、「AWS CDKでVPC作ろうとしたら作れなかったとき」ではSubnetがうまく作れなくて泣いてたじゃないですか。
今度は既存のVPCと既存のSubnetを使いたかったんですよ。本当にそれだけなんです、CloudForamtionなら三秒で出来るじゃないですか?????
やりたいこと
既存のVPCと既存のSubnetを使いたい。
CloudForamtionで書くとき
例えばALBとセキュリティグループの設定に使う時とか、こういう感じでできるじゃないですか。
なんかこう、VpcIdとSubnetsにはそれぞれのIDをそのまま書けばさらっと設定してくれるじゃないですか。
Resources:
SecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: !Sub ${AWS::StackName}-alb
SecurityGroupIngress:
- CidrIp: "0.0.0.0/0"
IpProtocol: "TCP"
FromPort: 80
ToPort: 80
VpcId: !Ref VpcId
LoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Subnets: !Ref Subnets
SecurityGroups:
- !Ref SecurityGroup
CDKで既存のVPCをSubnetを指定しつつ取り込む
真剣に一週間くらい悩んでしまったんですけど、結論だけ書くとこうです。
~2020/02/21 追記~
SubnetをID指定で取り込む方法を知ったので追記しました。
このセクションは過去の未熟な私の導き出した不完全な解答。
from aws_cdk import (
aws_ec2 as ec2,
)
VPCID='vpc-xxxxxxxx'
vpc=ec2.Vpc.from_vpc_attributes(
self, f"vpc{id}",
vpc_id=VPCID,
availability_zones=['ap-northeast-1b', 'ap-northeast-1c'],
publicSubnetIds=['subnet-xxxxxxxx', 'subnet-xxxxxxxx'],
private_subnet_ids=['subnet-xxxxxxxx', 'subnet-xxxxxxxx']
)
で、Subnetを実際に使用するにはこの記述で引っ張ってこれます。
ドキュメントでISubnet
で指定しろって書いてあるとこに使うといいです。
# パブリック
ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC, one_per_az=True)
# プライベート
ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE, one_per_az=True)
顧客が本当に求めていた正解
こうして我々は無事にSubnetを名指しで使う正しい術を手に入れたのである。
from aws_cdk import (
aws_ec2 as ec2,
aws_elasticloadbalancingv2 as elb,
)
# IDから既存のVPCを取得する
VPCID='vpc-xxxxxxxx'
vpc=ec2.Vpc.from_lookup(self, 'vpcId', vpc_id=VPCID)
# IDから既存のSubnetを取得する
subnets = [
ec2.Subnet.from_subnet_attributes(
self, "some_id_string",
availability_zone='ap-northeast-1b', # 指定したいSubnetのアベイラビリティーゾーン
subnet_id='subnet-xxxxxxxx' # 指定したいSubnetのID
),
(以下略)
]
# 既存のVPC・Subnetを設定したALBを新規作成する
elb.ApplicationLoadBalancer(
self, f"elbId",
vpc=vpc,
vpc_subnets=ec2.SubnetSelection(subnets=subnets, one_per_az=True)
)
~HAPPY END~
参考URL
AWS CDK(class Vpc)
https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ec2.Vpc.html#static-from-wbr-lookupscope-id-options
CDKのドキュメントはTypeScriptのが一番読みやすいのでTSの方でざっくり確認してからPythonのドキュメント読むんですが、Pythonのドキュメントどうして読みづらいんですかね。慣れですかね。
boto3のドキュメントもだいぶ読みづらい。
おわり
CDK面白いのでもっと流行ってほしいですね!!私はPythonが好きですよ!!