AWS Cloud Development Kit ( CDK )を試してみよう!

最近はクラウドの普及によって開発者の方がインフラを触ることも増えてきているのではないでしょうか?
本ブログでは、慣れ親しんだプログラミング言語で AWS リソースを構築・運用できるサービス、 AWS Cloud Development Kit ( 以下 CDK )をご紹介します。
目次
AWS CDK とは?
AWS CDK とは、最新のプログラミング言語を使用して AWS のインフラストラクチャをコードとして定義し、それをデプロイ、管理する事ができるソフトウェア開発フレームワークです。つまり、 CloudFormation や Terraform のような IaC ( Infrastructure as Code )の手段の 1 つということです。
AWS CDK を使用するメリット
■ インフラストラクチャの環境管理の属人化を防げる。
手動でたくさんのリソースを構築していると全体の構成を作成者しか把握できていない状態になる場合がありますが、コードでリソースを作成、管理することで構成の把握が容易になります。
■ 一度書いたコードは使い回せる。
似たような構成を構築する際に、手動では同じ作業を 2 度繰り返す必要がありますが、コードだと内容を少し変更するだけで済みます。
■ 全く同じ構成を簡単に複製できる。
障害や検証のために、本番環境と同じ構成を構築しなければならない場合などに、手動に比べてより早く正確に構築することができます。
■ 慣れ親しんだ言語を使用できる。
AWS CDK は Python や Java など普段の開発に使用している慣れ親しんだ言語を用いて記述できるため、 IaC のために新しい言語を学ぶ必要がありません( CloudFormation は JSON or YAML 、 Terraform は HCL で記述)。
上記のように、一度できるようになると非常に便利なサービスとなります。
AWS CDK が現在対応している言語は下記となります。
・TypeScript
・Python
・JavaScript
・Java
・C#/.Net
・Go
本ブログでは Cloud9 上で AWS CDK を使用して VPC と EC2 を構築してみたいと思います。読者のみなさまが少しでも AWS CDK がどのようなものかをイメージしていただければ幸いです。
それでは AWS CDK での構築を開始しましょう。
※ Cloud9 に関してご存知ない方は下記記事を御覧ください。
ITの勉強にAWS Cloud9を使ってみては?
AWS CDK で構築を行うための準備をしてみよう
Cloud9 を開き、まずは AWS CDK のプロジェクトを作成します。言語は Python を使用します。
tf-role:~/environment $ mkdir cdk-practice
tf-role:~/environment $ cd cdk-practice/
tf-role:~/environment/cdk-practice $ cdk init app --language python
Python の仮想環境をアクティブ化します。
tf-role:~/environment/cdk-practice (master) $ source .venv/bin/activate
必要なモジュールをインストールします。
requirements.txt ファイルの中身はデフォルトのままで大丈夫です。
(.venv) tf-role:~/environment/cdk-practice (master) $ python -m pip install -r requirements.txt
これで準備が完了しました。
AWS CDK で VPC を構築してみよう
それでは VPC を作成していきましょう。
cdk_practice_stack.py ファイルに VPC を作成するコードを記述します。
今回は VPC の中にパブリックサブネットとプライベートサブネットを 1 つずつ作成します。
# cdk_practice_stack.py
from aws_cdk import (
Stack,
aws_ec2 as ec2
)
from constructs import Construct
class CdkPracticeStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
vpc = ec2.Vpc(
self,
"CDK-VPC",
cidr='10.0.0.0/16',
max_azs=1,
subnet_configuration=[
ec2.SubnetConfiguration(
name='PublicSubnet',
subnet_type=ec2.SubnetType.PUBLIC,
cidr_mask=24
),
ec2.SubnetConfiguration(
name='PrivateSubnet',
subnet_type=ec2.SubnetType.PRIVATE_ISOLATED,
cidr_mask=24
)
]
)
デプロイする前に、デプロイされるサービスを確認してみましょう。
(.venv) tf-role:~/environment/cdk-practice (master) $ cdk diff
下画像のようにデプロイされるサービス一覧が表示されます。
特に問題なさそうですね。

確認も完了しましたので、いよいよデプロイしてみましょう。
(.venv) tf-role:~/environment/cdk-practice (master) $ cdk deploy
Do you wish to deploy these changes (y/n)? y
下画像の様に表示されれば、無事にデプロイ完了です。

AWS マネージドコンソールの VPC サービス画面から確認してみます。
マネジメントコンソール上でも作成されていることが確認できました。

AWS CDK で EC2 を構築してみよう
続いて、先程構築した VPC のパブリックサブネットに EC2 、 Security Group を作成します。
VPC 作成時に編集した cdk_practice_stack.py ファイルに EC2 とセキュリティグループを作成するコードを追記します。今回は SSH キーペアは予め作成したものを使用し、セキュリティグループのインバウンドは 22 番ポートを全てのソースから受付可能に設定します。
※ 本番環境ではソースは制限するようにしてください。
# cdk_practice_stack.py
from aws_cdk import (
Stack,
aws_ec2 as ec2
)
from constructs import Construct
class CdkPracticeStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
vpc = ec2.Vpc(
self,
"CDK-VPC",
cidr='10.0.0.0/16',
max_azs=1,
subnet_configuration=[
ec2.SubnetConfiguration(
name='PublicSubnet',
subnet_type=ec2.SubnetType.PUBLIC,
cidr_mask=24
),
ec2.SubnetConfiguration(
name='PrivateSubnet',
subnet_type=ec2.SubnetType.PRIVATE_ISOLATED,
cidr_mask=24
)
]
)
security_group = ec2.SecurityGroup(
self,
"CDK-EC2-SG",
vpc=vpc,
description="Allow ssh access to ec2 instances",
allow_all_outbound=True # このセキュリティグループからの全てのアウトバウンドトラフィックを許可する
)
security_group.add_ingress_rule(
peer=ec2.Peer.any_ipv4(),
connection=ec2.Port.tcp(22),
description="allow ssh access from any IPV4"
)
instance = ec2.Instance(
self,
'CDK-EC2',
instance_type=ec2.InstanceType('t2.micro'),
machine_image=ec2.MachineImage.latest_amazon_linux(),
vpc=vpc,
vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC),
key_name="test",
security_group=security_group
)
コードの記述が完了したらデプロイしていきます。
(.venv) tf-role:~/environment/cdk-practice (master) $ cdk deploy
Do you wish to deploy these changes (y/n)? y
下画像の様に表示されれば、無事にデプロイ完了です。

AWS マネージドコンソールの EC2 サービス画面から確認してみます。
マネジメントコンソール上でも作成されていることが確認できました。
セキュリティグループも正常に設定されていることが確認できました。

AWS CDK で構築したリソースを削除しよう
最後にデプロイしたリソースを削除しましょう。
デプロイ時と同様に簡単に全てのリソースを削除することができます。
(.venv) tf-role:~/environment/cdk-practice (master) $ cdk destroy
Are you sure you want to delete: CdkPracticeStack (y/n)? y
下画像のように 「 destroyed 」 と表示されれば削除完了です。

念のため、 AWS マネージドコンソール上でも確認してみましょう。
まずは VPC を確認します。「 No Matching resource found 」と表示されているため、正常に削除されています。

次にインスタンスを確認します。
インスタンスも「終了済み」となっているため、正常に削除されています。

最後に、セキュリティグループを確認します。
「 No Matching resource found 」と表示されているため、正常に削除されています。

正常に全てのリソースが削除されたことを確認できました。
AWS CDK(まとめ)
いかがでしたでしょうか?
AWS CDK についてご紹介させていただきましたが、使い慣れた言語を使用して AWS リソースを扱えるため、開発者の方などは CloudFormationやTerraform に比べると親しみやすいのではないかと思います。
ぜひ皆様も使ってみてください。
CloudFormation 、 Terraform に関しての記事もよろしければ御覧ください。
AWS CloudFormation を試してみよう!
AWS 環境の Terraform コード化で実現! tfstate ファイルを活用した構成把握と管理法!
AWS CDK に関わらず、「 AWS でこんなことできないかな?」「自社サーバーを AWS に引っ越したいな。」等々ございましたら、是非弊社にご相談ください。
■ AWS CDK(ご参考)
*1「 AWS CDK とは」
https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html

元記事発行日: 2023年12月04日、最終更新日: 2024年02月28日