19
13

More than 3 years have passed since last update.

AWS CDKで既存VPCと既存Subnetを名指しで使う

Last updated at Posted at 2020-02-14

今日も元気にビルドを失敗していくスタイル。

前回、「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_vpc_attributesを使って既存のVPCを取り込みます。このときSubnetを指定しておくと、指定したSubnetだけ取り込んでくれます。
既存VPCだけ取り込むならfromLookupでもいいんですが、Subnetを指定する方法がsubnetGroupNameTagしかなさげな感じ。(ID指定できるやろって情報あれば教えてください)
今回は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が好きですよ!!

19
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
13