TOP>コラム一覧>【クラウドインフラをコード化】AWS CDKを利用してセッションマネージャー接続が出来るサーバを構築するまで

【クラウドインフラをコード化】AWS CDKを利用してセッションマネージャー接続が出来るサーバを構築するまで

はじめに

こんにちは。CTCの北川です。
今回はAWSにおけるインフラのコード化を実現するツールの一つであるAWS Cloud Development Kit(以下AWS CDK)について紹介させていただきます。
本記事では初めてAWS CDKを触る方に向けて、AWS CDKの使い方から、実際にサーバを動かすために必要な各リソースを構築する方法まで解説いたします。
AWS CDKは基礎的なAWSの知識と開発言語の知識が必要になりますが、本記事では基礎的な説明は省略し、AWS CDKにフォーカスを当ててご説明します。

AWS CDKとは

AWS CDKはAWSのインフラストラクチャをプログラミング言語としてコードで記述し、デプロイを行うためのオープンソースのソフトウェア開発フレームワークです。
AWS CDKを利用することで、AWSリソースの構築やプロビジョニング、デプロイ、管理などを効率的に行うことが出来るようになります。
現在対応する言語としては「TypeScript」「Python」「Java」「.NET」「Go」などがサポートされております。
利用する言語は各自慣れ親しんだものを使うのが一番ですが、本記事ではCDK利用にあたり良く利用されている「TypeScript」を用います。

AWS CDKの利用準備

AWS CDKを試すにあたり必要なコンポーネントを含む今回の開発環境は以下になります。

開発環境

  • OS:Windows
  • エディタ:VSCode
  • 言語:TypeScript

コンポーネント

  1. 1.Node.js (v18.x.x系推奨)
  2. 2.Typescript
  3. 3.AWS CLI (PowerUser権限を持つユーザのAccessKeyとSecretAccessKeyを設定)
  4. 4.AWS CDK

AWS CDKのインストール

AWS CDKは以下のコマンドでインストールができます。

$npm install aws-cdk-lib

その他コンポーネントに関しては適宜インストールと設定をお願いします。

AWS CDKプロジェクトの作成

それでは早速AWS CDKを試していきましょう。
まずは検証用にフォルダを作成していきます。
今回は cdk-testというフォルダを作成し、そこでコードを作っていきます。

次にVSCodeで只今作成したフォルダを開きます。

ターミナルからbashを選びcdkコードのテンプレートを作成するコマンドを入力します。

$cdk init app --language typescript

以下の図のように各種ファイルが作成されたら完了です。

次にCDKコードに必要なパッケージをインストールするために、以下コマンドを入力します。

$npm i

ここまでで、開発の準備が整いました。

AWS CDKにおける各ファイルの役割

今回利用するファイルに関して簡単に説明していきます。
ファイル名称に関しては作成したフォルダ名を参照するため、環境により異なる場合があります。

lib/cdk-test-stack.ts

CloudFormationにおけるStackの役割を担います。
こちらに作成したいリソース情報を定義していきます。

bin/cdk-test.ts

こちらがエントリポイントとして実行されます。
今回はS3バケットを作成するlib/cdk-test-stack.tsのみ呼び出しますが、複数のStackを作った場合には、それらを記述することで依存関係を定義できます。

その他にもCDKは様々な構成要素が組み合わさっておりますが、まずはこれらを利用してリソースを作成していく方法を覚えることから始めていきましょう。
それでは早速コードを書いてみましょう。

S3バケットの作り方

まずは簡単に作れるものとして、s3バケットを作成していきましょう。

/lib/cdk-test-stack.tsを開き、S3を作成するためのコードを記載していきます。

修正後のコードは以下になります。

※不要個所を削除し3行目と9~11行目を追加

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3'

export class CdkTestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const testBucket = new s3.Bucket(this, 'CdkTestS3',{
      bucketName: "ctc-kitagawa-test-20230130" //バケット名は適宜変更
    });
  }
}

/bin/cdk-test.tsにてデプロイ先のリージョンを指定します。

※不要箇所を削除し、8~10行目を追記

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkTestStack } from '../lib/cdk-test-stack';

const app = new cdk.App();
new CdkTestStack(app, 'CdkTestStack', {
  env:{
    region: "ap-northeast-1"
  }
});    

これにてコードの作成は完了です。
それではCDKコードの実行に移っていきます。

※注意:
以下作業からはAWSへのリソースが作成されるため課金が発生します。
ご認識の上で作業の実施をお願いいたします。

まず、初めてCDKコードをするAWSアカウントの場合、CDK用の初期設定を行う必要があります。
以下コマンドを実行します。

$cdk bootstrap

エラーが出た場合はIAM権限などを確認してみてください。

初期設定が完了したらリソースの作成に入ります。
まずは作成されるリソースを確認するために、以下コマンドを実行します。

$cdk diff

以下のようにS3バケットが作成される記載が確認出来たら実際にデプロイを行います。

Resources
[+] AWS::S3::Bucket CdkTestS3 CdkTestS39558EADF

上記のようにS3バケットが作成される記載が確認出来たら実際にデプロイを行います。

以下のコマンドを実行します。

$cdk deploy

デプロイが完了したらAWSマネジメントコンソールへ移動し、リソースが作成されているか確認しましょう。

図のようにS3が作成されていることが確認出来ました。

合わせてCloudFormationも確認します。
CDKにて定義したStackが作成されています。

それでは作成したリソースを削除していきます。
VScodeのターミナルに戻り、以下のコマンドを実行します。

$cdk destroy

これにより先ほど確認したS3バケット及びCloudFormationのStackが削除されます。

これでCDKによる作成から削除までが実施できました。

セッションマネージャー接続が出来るサーバの作り方

それではAWSにて一番よく作られる環境であるVPC+サーバの作成を行ってみましょう。
S3バケットの作成でも利用していましたが、CDKではコンストラクトと呼ばれるライブラリがあり、それらを利用することによってCloudFormationよりも遥かに少ない記述で、リソースを作成することが可能になります。

今回の場合、以下の50行に満たないコードのみでVPC、マルチAZサブネット、NatGW、IGW、ElasticIP、RouteTable、SecurityGroup、EC2インスタンスの構築を行うことが出来ます。

/lib/cdk-test-stack.tsのコードを以下に変更します。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2'

export class CdkTestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const testvpc = new ec2.Vpc(this, 'CdkTestVPC',{
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      vpcName: 'cdk-test-vpc',
    });

    const testsg = new ec2.SecurityGroup(this,'CdkTestSecurityGroup',{
      vpc: testvpc,
      allowAllOutbound: true,
    })

    const testinstance = new ec2.Instance(this, 'CdkTestInstance', {
      vpc: testvpc,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO),
      securityGroup: testsg,
      machineImage: new ec2.AmazonLinuxImage({ generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2 }),
      ssmSessionPermissions: true
    });

  }
}    

変更が完了したら確認コマンドとデプロイコマンドを実行していきます。

$cdk diff

$cdk deploy

エラーが出なければ作成完了です。
VPCやEIPが作成されるため、AWSの作成上限に引っかかる場合は、上限緩和申請を行うか、別リージョンでの実行をお試しください。

※別リージョンで実行を行う場合
bin/cdk-test.tsで指定しているリージョンを変更し、以下のCDK用の初期設定コマンドを再度実行したうえで、デプロイコマンドを実行ください。

$cdk bootstrap

AWSマネジメントコンソール上で作成された各リソースの作成状況や、サーバへのセッションマネージャー接続が確認出来たらリソースを削除します。

$cdk destroy

これにて実作業は終了になります。

AWS CDKリファレンス

作成に必要なリソースのコンストラクトはAWSCDKリファレンスに記載されておりますので、必要に応じてご確認いただければと思います。

https://docs.aws.amazon.com/cdk/api/v2/

例えば今回作成したEC2インスタンスは以下を参照しております。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Instance.html

おわりに

いかがでしたでしょうか。
今回はCDKを利用してリソースを作ることが出来るようになるまでの解説を行いました。

クラウド活用が当たり前になりつつある中、クラウドインフラのコード化を実践される企業様も増えてきております。
今回ご紹介したものはCDKを利用するにあたっての最低限の情報となり、ファイル構成やStackの分け方、自身でのコンストラクト定義など実運用を視野に入れる場合に意識するべき要素はまだまだございます。
今後も記事やセミナーでCDKに関してはご紹介していきますので、もしご興味あればご確認いただき、ぜひ、自社のクラウドインフラのコード化をご検討いただければと存じます。

CTCは、AWSのビジネス利活用に向けて、お客様のステージに合わせた幅広い構築・運用支援サービスを提供しています。 経験豊富なエンジニアが、ワンストップかつ柔軟にご支援します。 ぜひ、お気軽にお問い合わせください。

お問い合わせ



【著者プロフィール】

北川 裕介 (きたがわ ゆうすけ)

伊藤忠テクノソリューションズ株式会社 クラウドアーキテクト

クラウド系のエンジニアとしてインフラ構築におけるPMやSEを担当。 近年はクラウドインフラのIaC化の実現も行っている。

北川 裕介 (きたがわ ゆうすけ)

TOP>コラム一覧>【クラウドインフラをコード化】AWS CDKを利用してセッションマネージャー接続が出来るサーバを構築するまで

pagetop