LoginSignup
1
1

More than 1 year has passed since last update.

Pythonで書くAWS CDK ~既存VPCを使ったVPCエンドポイント作成~

Posted at

概要

AWS CDK はAWS上にクラウドサービスを構築するための便利なソフトウェアです。

個人で検証している際は特に、以下の点で便利だと感じています。

  • 課金抑止
    • 検証したいときに作り、検証が終わったときに削除できる
    • 削除コマンドを実行すれば、消し忘れることがない
  • 作業効率化
    • 同じ環境をすぐに再現できる

この記事ではPythonを使って、AWS CDKによるクラウドサービス構築を行う方法を記載していきます。

前提条件

この記事では以下の環境を使用しています。

OS:Windows10
言語:Python3.7

CDKを始めるための準備

node.jsをWindows10へインストールする

NVM for Windows のダウンロードとインストール

CDKはnode.jsを使用するため、CDKを動作させる環境へnode.jsをインストールする。
ここでは、node.jsを直接インストールするのではなく、node.jsをバージョン管理してくれるnvmをインストールし、そこからnode.jsをインストールするようにした。

これは、node.js自体のバージョンアップが素早く、node.jsのバージョン管理も後々必要になってくると想定されるためだ。
※CDK自体もnode.jsのバージョンに依存している

Windows環境へnvmをインストールするためには、NVM for Windowsを使用する。

GitHubのページへアクセスして、以下の Download Now! を選択する。
node.js ダウンロード1

基本的には setup.exe をダウンロードして、実行すれば良い。
node.js ダウンロード2

Powershellを実行して nvm --version と実行する。

nvm --version

バージョンが出力されればインストールが成功している。

出力
Running version 1.1.9.

node.jsのインストール

まず、使用可能なnode.jsのバージョンを確認する。

nvm list available
出力
|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    19.3.0    |   18.12.1    |   0.12.18    |   0.11.16    |
|    19.2.0    |   18.12.0    |   0.12.17    |   0.11.15    |
|    19.1.0    |   16.19.0    |   0.12.16    |   0.11.14    |
|    19.0.1    |   16.18.1    |   0.12.15    |   0.11.13    |
|    19.0.0    |   16.18.0    |   0.12.14    |   0.11.12    |
|   18.11.0    |   16.17.1    |   0.12.13    |   0.11.11    |
|   18.10.0    |   16.17.0    |   0.12.12    |   0.11.10    |
|    18.9.1    |   16.16.0    |   0.12.11    |    0.11.9    |
|    18.9.0    |   16.15.1    |   0.12.10    |    0.11.8    |
|    18.8.0    |   16.15.0    |    0.12.9    |    0.11.7    |
|    18.7.0    |   16.14.2    |    0.12.8    |    0.11.6    |
|    18.6.0    |   16.14.1    |    0.12.7    |    0.11.5    |
|    18.5.0    |   16.14.0    |    0.12.6    |    0.11.4    |
|    18.4.0    |   16.13.2    |    0.12.5    |    0.11.3    |
|    18.3.0    |   16.13.1    |    0.12.4    |    0.11.2    |
|    18.2.0    |   16.13.0    |    0.12.3    |    0.11.1    |
|    18.1.0    |   14.21.2    |    0.12.2    |    0.11.0    |
|    18.0.0    |   14.21.1    |    0.12.1    |    0.9.12    |
|    17.9.1    |   14.21.0    |    0.12.0    |    0.9.11    |
|    17.9.0    |   14.20.1    |   0.10.48    |    0.9.10    |

This is a partial list. For a complete list, visit https://nodejs.org/en/download/releases

安定している最新バージョンをインストールしたいため、LTS列の一番上のバージョンを指定してインストールしよう。

nvm install 18.12.1

インストールされたことを確認するためにnvm listを実行する。

nvm list
出力
18.12.1

最後に使用するnode.jsのバージョンを指定するためにnvm useコマンドを実行する。

nvm use 18.12.1

確認してみる。

nvm list
出力
  * 18.12.1 (Currently using 64-bit executable)

このように*がついていれば大丈夫だ。

AWSへアクセスするCDK用のアクセスキーの作成

CDK用のIAMユーザーでアクセスキーを発行する。

  1. AWSコンソールへログインする。
  2. IAMのページを開く。
  3. 対象のIAMユーザーをクリックする。
  4. 認証情報タブを開く。
  5. アクセスキーの作成ボタンを押す。

aws configの設定

既定で使用されるプロファイルの設定を行うために、%USERPROFILE%\.aws\configファイルを作成する。
※%USERPROFILE%はC:\Users\hogehoge

config
[default]
region=ap-northeast-1

ここではリージョンとして東日本を設定。

aws credentialsの設定

defaultプロファイルを使う際の認証を行うために、 %USERPROFILE%\.aws\credentialsファイルを作成する。

credentials
[default]
aws_access_key_id=【自分のキーIDaws_secret_access_key=【自分のキー名】

CDKをインストールする

Powershell上で以下を実行する。

npm install -g aws-cdk

バージョンを確認して表示されればOKだ。

cdk --version

CDK Bootstrapの実行

CDKを実行するためには、CDKを使ってサービスを構築するAWSアカウント上に、S3とIAMロールが必要だ。
CloudFormation(CDKToolKitという名前)で作成される。

これらを作成するためにcdk bootstrapコマンドを実行する。

cdk bootstrap aws://【自分のAWSアカウント番号】/【リージョン】

CDK アプリケーションの作成

初期セットアップ

CDK用にフォルダを作成する。ここではtestフォルダを使う。
Powershellでフォルダ内へ移動したら、初期セットアップのために以下のコマンドを実行する。

cdk init app --language python
出力
Applying project template app for python

# Welcome to your CDK Python project!

This is a blank project for CDK development with Python.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

This project is set up like a standard Python project.  The initialization
process also creates a virtualenv within this project, stored under the `.venv`
directory.  To create the virtualenv it assumes that there is a `python3`
(or `python` for Windows) executable in your path with access to the `venv`
package. If for any reason the automatic creation of the virtualenv fails,
you can create the virtualenv manually.

~~中略~~

 All done!

コマンド実行後には以下のようなフォルダとファイルが作成されている。

testフォルダ
.venv
test
tests
.gitignore
app.py
cdk.json
README.md
requirements-dev.txt
requirements.txt
source.bat

次にPythonの仮想環境を起動して、必要なPythonパッケージをpipでインストールする。

Python仮想環境のActivate(testフォルダ内で実行)
.\.venv\Scripts\activate
Pythonパッケージをインストール
python -m pip install -r requirements.txt

app.pyファイル内でデプロイ先となる環境を設定

生成されたapp.pyのコメント文を削除してenv=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')),だけアンコメントする。

これは現在OS上に設定された環境変数を読み取ってくれる。

app.py
#!/usr/bin/env python3
import os

import aws_cdk as cdk

from test.test_stack import TestStack


app = cdk.App()
TestStack(app, "TestStack",
    env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')),
    )

app.synth()

チュートリアル 既存VPCと既存サブネットへECRのVPCエンドポイント作成

VPCやサブネットなど変更が少ないAWS上のリソースは、既に作成されていることが多いだろう。
その場合を想定し、既存のリソースを使いつつ、CDKでサービスをデプロイする方法を記載する。

test_stack.py
from aws_cdk import (
    Stack,
    aws_ec2,
)
from constructs import Construct


class TestStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # CDKで管理していない既存のVPCとサブネットを定義する。
        vpc = aws_ec2.Vpc.from_lookup(self, id="test-vpc", vpc_id="VPCIDを入力")
        subnet_filter = aws_ec2.SubnetFilter.by_ids(["サブネットIDを入力"])
        security_group = aws_ec2.SecurityGroup.from_lookup_by_id(
            self, id="test-sg", security_group_id="セキュリティグループIDを入力"
        )

        interface_vpc_endpoint_api = aws_ec2.InterfaceVpcEndpoint(
            self, "VPC Endpoint api",
            private_dns_enabled=True,
            vpc=vpc,
            service=aws_ec2.InterfaceVpcEndpointService(
                "com.amazonaws.ap-northeast-1.ecr.api", 443
            ),
            subnets=aws_ec2.SubnetSelection(subnet_filters=[subnet_filter]),
            security_groups=[security_group],
        )

既に作成されているAWSリソースの定義

まず、VPCとサブネット、セキュリティグループを定義する。これらは既に作られていることを想定している。

vpc = aws_ec2.Vpc.from_lookup(self, id="test-vpc", vpc_id="VPCIDを入力")
subnet_filter = aws_ec2.SubnetFilter.by_ids(["サブネットIDを入力"])
security_group = aws_ec2.SecurityGroup.from_lookup_by_id(
    self, id="test-sg", security_group_id="セキュリティグループIDを入力"
)

aws_ec2.Vpc.from_lookup

aws_ec2.SubnetFilter.by_ids

aws_ec2.SecurityGroup.from_lookup_by_id

VPCエンドポイントの定義

今回は例としてecrのapiエンドポイントを作成する。

interface_vpc_endpoint_api = aws_ec2.InterfaceVpcEndpoint(
    self, "VPC Endpoint api",
    private_dns_enabled=True,
    vpc=vpc,
    service=aws_ec2.InterfaceVpcEndpointService(
        "com.amazonaws.ap-northeast-1.ecr.api", 443
    ),
    subnets=aws_ec2.SubnetSelection(subnet_filters=[subnet_filter]),
    security_groups=[security_group],
)

aws_ec2.InterfaceVpcEndpoint

CDK によるデプロイ

以下のコマンドをtestフォルダで実行して、VPCエンドポイントを作成する。

cdk deploy

CDK によるVPCエンドポイントの削除

以下のコマンドをtestフォルダで実行して、VPCエンドポイントを削除する。

cdk destroy

参考資料

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