AWS CDKでDocument DBを作成してみた

CDKを使ってDocument DBを構築してみたので、備忘的に記録を残しておきます。今回は、EC2を踏み台として使ってDocument DBに接続する構成を目標としています。また、EC2への接続はSession Managerを使って行う形としています。

全コードはGithubを参照してください。
[Githubはここ](https://github.com/ShinyaT1994/cdk-documentdb.git)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660703/45f8d20e-9a89-5a4a-096c-702b60e06c0d.png)

## 前提条件
- AWS CDK v.2 がインストールされていること
- Python 3.x がインストールされていること
- AWSアカウントがあり、AWS CLIが設定されていること

※Cloud9を使うとこの辺りがPassできるため、Cloud9を使って今回の記事の内容は作成しています。

## 構築手順
### 1. CDKアプリの初期化
先ずはCDKアプリの初期化を行います。

```bash
$ mkdir cdk-documentdb
$ cd cdk-documentdb
$ cdk init --language python
```

### 2.必要なパッケージをインストール

続いて必要パッケージのインストールになります。
ここでは、CDKアプリを初期化した際に作成された.venvを有効化しています。

```bash
$ source .venv/bin/activate
$ pip install -r requirements.txt
```

### 3. スタックの記述
```python
from aws_cdk import (
    Stack,
    aws_docdb as docdb,
    aws_ec2 as ec2,
    aws_iam as iam,
    aws_logs as logs,
    
)
from constructs import Construct

class CdkDocumentdbStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        
        docdb_port = 27017
        
        # VPC
        vpc = ec2.Vpc(
            self,
            'VPC',
            max_azs=2,
            restrict_default_security_group=True,
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    name='public',
                    subnet_type=ec2.SubnetType.PUBLIC,
                    cidr_mask=24,
                ),
                ec2.SubnetConfiguration(
                    name='private',
                    subnet_type=ec2.SubnetType.PRIVATE_ISOLATED,
                    cidr_mask=24,
                ),
            ],
        )
        
        # Security Groups
        sg_bastion = ec2.SecurityGroup(
            self,
            'SecurityGroupForBastionInstance',
            vpc=vpc,
        )
        
        sg_docdb = ec2.SecurityGroup(
            self,
            'SecurityGroupForDocumentDb',
            vpc=vpc,
        )
        sg_docdb.add_ingress_rule(
            peer=ec2.Peer.security_group_id(sg_bastion.security_group_id),
            connection=ec2.Port.tcp(docdb_port),
        )
        
        # 踏み台用EC2
        # - 簡単のため、Public Subnet上に作成
        # - 接続はSSMを使って接続する
        bastion = ec2.Instance(
            self,
            'BastionInstance',
            instance_type=ec2.InstanceType('t3.nano'),
            machine_image=ec2.MachineImage.latest_amazon_linux2(),
            vpc=vpc,
            security_group=sg_bastion,
            ssm_session_permissions=True,
            vpc_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PUBLIC),
        )
        
        # DocumentDB
        docdb_cluster = docdb.DatabaseCluster(
            self,
            'DocumentDbCluster',
            instance_type=ec2.InstanceType('t4g.medium'),
            master_user=docdb.Login(username='dbuser'),
            vpc=vpc,
            cloud_watch_logs_retention=logs.RetentionDays.TWO_MONTHS,
            engine_version='5.0.0',
            instances=1,
            port=docdb_port,
            security_group=sg_docdb,
            storage_encrypted=True,
            vpc_subnets=ec2.SubnetSelection(
                subnet_type=ec2.SubnetType.PRIVATE_ISOLATED
            ),
        )
```

### 4. CDKのデプロイ
```bash
cdk deploy
```

デプロイが完了すると、DocumentDBとアクセス用のEC2が構築されます。
以上で構築完了です。

### 5. Document DBへの接続検証
EC2からDocumentDBへの接続検証については、下のドキュメントを参照いただけると分かりやすいと思いますので、ご確認下さい。

[Amazon EC2 を使用したConnect](https://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/connect-ec2.html#cloud9-insert-query)

## まとめ
この記事では、CDKを使ってDocumentDBを構築した記録を残しています。
どなたかの参考になれば幸いです。

## 参考
- [Create a Simple URL Shortener with AWS CDK and DocumentDB](https://medium.com/tysonworks/create-and-deploy-simple-url-shortener-with-aws-cdk-and-documentdb-875ab99d51f5)
- [aws_cdk.aws_docdb](https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_docdb.html)