1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

技術検証:AWS CDKを使ったVPC、サブネット、およびルートテーブルの作成方法

1
Last updated at Posted at 2024-12-28

はじめに

前回の記事に引き続き、AWS CDKの理解を深めるために、ハンズオン形式で技術検証を行います。

今回の内容は、以前CloudFormationやTerraformで作成したコードをAWS CDKに変換して試すという形式になっています。

AWS CDKを学び始めたばかりの初心者向けの内容ですので、その点をご了承いただければ幸いです。

前回の記事の続きです

自分用の備忘録として、AWS CDKの基本的な構造、機能、メリットを簡単にまとめた内容になっています。ぜひ参考にしてください。

また、知り合いが書いたとても分かりやすい神記事もありますので、ぜひこちらもご覧ください!

前提準備

この記事では、AWS CDKプロジェクトを実行するためにAWS CLIコマンドを使用してインフラをデプロイしていきます。

まだAWS CLIの導入や初期セットアップが終わっていない方は、上記の記事をご参考ください。

必要な環境を準備する

AWS CDKはNode.jsを使用します。まずは以下のコマンドを実行してCDK CLIをインストールしてください。

npm install -g aws-cdk

また、今回はPython 3.7以上の環境を使用してインフラを構築します。仮想環境を作成し、必要なモジュールをインストールしてください。

python3 -m venv .env
source .env/bin/activate  # Windows の場合: .env\\Scripts\\activate

以下は、M1 MacBookでセットアップを行った際の画面です。

スクリーンショット 2024-12-28 18.11.13.png

続いて、以下のコマンドを実行して、AWS CDK v2とconstructsモジュールをインストールします。

pip install aws-cdk.core aws-cdk.aws-ec2
pip install aws-cdk-lib constructs

プロジェクトの作成とファイル準備

新しいAWS CDKプロジェクトを初期化するために、以下のコマンドを実行してください。

mkdir my-cdk-project
cd my-cdk-project
cdk init app --language python

次に、lib/フォルダを作成し、その中にvpc_stack.pyファイルを作成します。

mkdir lib
touch lib/vpc_stack.py

vpc_stack.pyファイルの作成

vpc_stack.py ファイルをエディタで開き、以下のコードを記述してください。

lib/vpc_stack.py
from aws_cdk import Stack, CfnOutput
from aws_cdk import aws_ec2 as ec2

class VpcStack(Stack):
    def __init__(self, scope: Stack, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # Create VPC
        vpc = ec2.Vpc(
            self, "ProjectVpc",
            ip_addresses=ec2.IpAddresses.cidr("10.0.0.0/16"),
            max_azs=2,
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    name="PublicSubnet",
                    subnet_type=ec2.SubnetType.PUBLIC,
                    cidr_mask=20
                ),
                ec2.SubnetConfiguration(
                    name="PrivateSubnet",
                    subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS,  # PRIVATE_WITH_EGRESS を使用
                    cidr_mask=20
                )
            ]
        )

        # Output VPC ID
        CfnOutput(self, "VpcId", value=vpc.vpc_id)
        
        # Associate Public Route Table with Subnets (without IGW)
        public_route_table = ec2.CfnRouteTable(
            self, "PublicRouteTable",
            vpc_id=vpc.vpc_id,
            tags=[{
                "key": "Name",
                "value": "プロジェクト-rtb-public"
            }]
        )

        for index, subnet in enumerate(vpc.public_subnets):
            ec2.CfnSubnetRouteTableAssociation(
                self, f"PublicSubnetAssociation{index}",
                subnet_id=subnet.subnet_id,
                route_table_id=public_route_table.ref
            )

        # Create Private Route Table (also without IGW)
        private_route_table = ec2.CfnRouteTable(
            self, "PrivateRouteTable",
            vpc_id=vpc.vpc_id,
            tags=[{
                "key": "Name",
                "value": "プロジェクト-rtb-private1-ap-northeast-1a"
            }]
        )

        for index, subnet in enumerate(vpc.private_subnets):
            ec2.CfnSubnetRouteTableAssociation(
                self, f"PrivateSubnetAssociation{index}",
                subnet_id=subnet.subnet_id,
                route_table_id=private_route_table.ref
            )

        # Output for Route Tables (Debugging Purpose)
        CfnOutput(self, "PublicRouteTableId", value=public_route_table.ref)
        CfnOutput(self, "PrivateRouteTableId", value=private_route_table.ref)

このコードは AWS CDK を使用して、VPC、サブネット、ルートテーブルを設定しています。

app.py ファイルの作成

プロジェクトのルートにある app.py をエディタで開き、以下の内容を記述してください。

app.py
from aws_cdk import App
from lib.vpc_stack import VpcStack  # lib/vpc_stack.py から VpcStack をインポート

app = App()
VpcStack(app, "VpcStack")
app.synth()

cdk synth コマンドを実行してみた

プロジェクトの最終的なディレクトリ構造は次のようになります。

my-cdk-project/
├── app.py                 # エントリーポイント
├── cdk.json               # CDK 設定ファイル
├── requirements.txt       # 必要なパッケージ
├── lib/                   # スタック定義を格納するフォルダ
   └── vpc_stack.py       # VPC スタックのコード
・・・・・

以下のコマンドを実行して、テンプレートが正しく生成されるかを確認してください。

cdk synth

もし以下のようなエラーが発生した場合は、cdk bootstrap コマンドを実行する必要があります。

このエラーは、AWS CDK のブートストラップリソースがまだ作成されていないことを示しています。

Parameters:
  BootstrapVersion:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /cdk-bootstrap/hnb659fds/version
    Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]

このエラーが発生した場合、以下のコマンドを実行してください。

cdk bootstrap

AWS CDK では、一部のリソース(例: IAM ロールや S3 バケットなど)をデプロイする前提条件として、環境にブートストラップリソースを作成する必要があります。

cdk deploy コマンドを実行してみた

テンプレートが正しく生成されたら、以下のコマンドを実行してインフラを AWS にデプロイします。

cdk deploy

実行例は以下の通りです。

(.env) ➜  my-cdk-project git:(honda-branch) ✗ cdk deploy                                        

✨  Synthesis time: 7.95s

current credentials could not be used to assume 'arn:aws:iam::xxx:role/cdk-hnb659fds-deploy-role-xxx-ap-northeast-1', but are for the right account. Proceeding anyway.

(・・・省略)

 ✅  VpcStack

✨  Deployment time: 162.06s

Outputs:
VpcStack.PrivateRouteTableId = rtb-037c1b43e4fbf90d6
VpcStack.PublicRouteTableId = rtb-0b4fc7c2bb4074c57
VpcStack.VpcId = vpc-02fe119e49ac8cec8
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:xxx:stack/VpcStack/5b2c8f50-c505-11ef-bd14-0aa6878f9a5d

✨  Total time: 170.02s

AWS マネジメントコンソールでの確認

AWS マネジメントコンソール上でも、Python を用いて作成したインフラ構築が自動的に完了していることを確認できました。

スクリーンショット 2024-12-28 19.42.27.png

正直かなり苦戦しましたが、無事に検証を終えることができてよかったです(笑)。

まとめ

ここまで読んでいただき、ありがとうございました!

今回の挑戦では、AWS CDK を用いてインフラを構築するという初めての体験をしました。

正直、手こずる場面も多くありましたが、何とか検証を終えることができてホッとしています。

基本的な内容ではありますが、誰かの技術的な助けとなれば幸いです!

参考記事

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?