AWS CDK V2でVPCを新規作成してみよう!

ならたけぽん
2023-03-30
2023-03-30

おつかれさまです。ならたけぽんです。🌸

何か、寝て起きて気がつけば、もう3月もおしまいだそうで。
私はどこか別の世界線にでもいたのだろうか。。。🌏

😣😤😲

どうやら魔法も剣術も使えないようなので、
いまできることをしましょうか。。。

というわけで、今回は、AWS CDK v2で「VPC」を新規作成していきます!😇

※以下、TypeScriptでの記載になりますので、
 あらかじめご了承ください。

※ちなみに、ご参考まで。
  前々回の記事こちら
  前回の記事はこちら



 🌷 手順1!:「[プロジェクト名]-stack.ts」ファイルを開きます!

 「cdk init ~」のコマンドを実行すると「lib」ディレクトリも作成されます。
 その「lib」ディレクトリ直下に「[プロジェクト名]-stack.ts」ファイルも作成されます。
 このファイルを開きます!🐶

 例)
  [プロジェクト名]を「blog」と設定した場合、
  「lib」ディレクトリ直下に「blog-stack.ts」ファイルも作成されます。
  このファイルを開きます。
  
  ※このブログ執筆時、この「blog-stack.ts」ファイルの中身は、
   以下のようになっていました。

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

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

    // The code that defines your stack goes here

    // example resource
    // const queue = new sqs.Queue(this, 'BlogQueue', {
    //   visibilityTimeout: cdk.Duration.seconds(300)
    // });
  }
}



 🌷 手順2!:「VPC」新規作成用のソースコードを追記します!

 いきなり、おもむろに、

  「aws-ec2」ライブラリのインポート:1行
  「VPC」新規作成:1行

 の計2行のソースコードを追記します!🐮
 
 ※既存「VPC」の取り込みもできるのですが、今回は新規作成します!

 ※以下は、[プロジェクト名]を「blog」と設定した場合の「blog-stack.ts」ファイルですが、
  追記する行はプロジェクト名に関わらず同一
です!

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as ec2 from 'aws-cdk-lib/aws-ec2'; // 新規追加:※1

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

    // The code that defines your stack goes here
    const vpc = new ec2.Vpc(this, 'Vpc', {});  // 新規追加:※2

    // example resource
    // const queue = new sqs.Queue(this, 'BlogQueue', {
    //   visibilityTimeout: cdk.Duration.seconds(300)
    // });
  }
}

 ※1:「aws-ec2」ライブラリのインポート:1行
 ※2:「VPC」新規作成:1行



 🌷 手順3!:AWSプロファイルを確認します!

 新規「VPC」を作成するAWSアカウントを指定するように、
 AWSプロファイルを確認します!🐨
 
 AWSプロファイルって何ぞや?という方は、、、
 あ、ブログ記事書いてないや。。。😱
 次回以降、どこかで書きますね。。。🐌



 🌷 手順4!:ブートストラップのコマンドを叩きます!

 早く「VPC」を新規作成したいのはやまやまなのですが、ものごとには順序がありんす。💗

 AWS CDK v2の実行前には、プロビジョニングのため、ブートストラップが必要になります。
 S3バケットとかIAMロールとかを生成するために、
 AWS CDK v2で生成したリソースを反映するAWSのリージョン毎に
実行が必要になります。。。

 まぁ、コマンド1発叩くだけですけどね!🐷

> cdk bootstrap [AWSアカウント番号]/[リージョン名] --profile [プロファイル名] 

 例えば、

  AWSアカウント番号:123456789012
  リージョン名:ap-northeast-1 (東京リージョン)
  プロファイル名:blog-profile

 の場合、以下コマンドになります。

> cdk bootstrap 123456789012/ap-northeast-1 --profile blog-profile 

 例えば、

  AWSアカウント番号:123456789012
  リージョン名:ap-northeast-1 (東京リージョン)、ap-northeast-3 (大阪リージョン)
  プロファイル名:blog

 の場合、以下コマンドになります。
 要は、AWSリージョンは複数設定できます。

> cdk bootstrap 123456789012/ap-northeast-1 123456789012/ap-northeast-3 --profile blog-profile 



 🌷 手順5!:cdk diff コマンドを叩きます!

 早く「VPC」を新規作成したいのはやまやまなのですが、ものごとには~ありんす。💗

 AWS CDK v2を実行する際、
 血迷って変更すべきではないAWSアカウントのプロファイルを指定して、
 いきなり実行
してしまうと、
 既存環境が軒並み削除されたりと、
 阿鼻叫喚の様相を呈します。💀💀👻

 自分の目を覚ますためにも、cdk diffコマンドで差分を確認すると、
 ちょっとだけ救われることがあるかもしれません。😇

> cdk diff [スタック名] --profile [プロファイル名] --region [リージョン名]

 スタック名は、デフォルトですと、「[プロジェクト名]Stack」になります。
 ※ただし[プロジェクト名]の先頭文字は大文字

 正確を期すときは、以下ファイルをご確認ください。

  bin/[プロジェクト名].ts 

  ※「lib」ディレクトリと同じ階層に「bin」ディレクトリが存在しまして、
    その直下に「[プロジェクト名].ts」ファイルが存在します。
    このファイルの以下記載がスタック名になります。

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { [クラス名] } from '../lib/[プロジェクト名]-stack';

const app = new cdk.App()   
new [クラス名](app, '[プロジェクト名]Stack', { // スタック名!

(以下略)

  例)
    プロジェクト名:blog
    プロファイル名:blog-profile
    リージョン名:ap-northeast-1 (東京リージョン)
 
   の場合、以下のようになります。

> cdk diff BlogStack --profile blog-profile --region ap-northeast-1
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { BlogStack } from '../lib/blog-stack';

const app = new cdk.App()   
new BlogStack(app, 'BlogStack', { // スタック名!

(以下略)

 と、以上のようにcdk diffコマンドを叩いたとき、
 以下の例ように「[-]」や「destroy 」の表示があるときは、かなり注意が必要です。
 文字どおり、構築実行した際、既存環境のオブジェクトが削除されます!💀💀👻
 いままでの努力が、しっかりきっちり消えます。
 まるで舞い落ちた粉雪がはかなく解けるように。。。⛄
 露と落ち 露と消えにし 我が身かな。。。

 例)
  削除されるオブジェクトがあるとき
  (「[-]」やdestroy」の表示があるとき)

Resources
[-] AWS::EC2::VPC  VpcXXXXXXXX destroy
[-] AWS::EC2::Subnet VpcPublicSubnet1SubnetXXXXXXXX destroy

(以下略)

 環境を間違わなければ、
 以下例のように[-]」やdestroy」の表示は無く、
 新規作成を表す
[+]」の表示だけになります。

 例)
  新規作成されるオブジェクトがあるとき
  (「[+]の表示があるとき)

Resources
[+] AWS::EC2::VPC  VpcXXXXXXXX
[+] AWS::EC2::Subnet VpcPublicSubnet1SubnetXXXXXXXX

(以下略)



  🌷 手順6!:cdk deploy コマンドを叩きます!

 いよいよです。「VPC」の構築です!!!🎉
 以下1行です!!!🎉

> cdk deploy [スタック名] --profile [プロファイル名] --region [リージョン名]

 例)
    プロジェクト名:blog
    プロファイル名:blog-profile
    リージョン名:ap-northeast-1 (東京リージョン)
 
   の場合、以下のようになります。

> cdk deploy BlogStack --profile blog-profile --region ap-northeast-1

 うまくいくと、以下の例のように、「Total time」が表示されます。

BlogStack: creating CloudFormation changeset...

 ✅  BlogStack 

✨  Deployment time: 209.54s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/BlogStack/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

✨  Total time: 216.18s

 そして、ドキドキしながらAWS管理画面を確認すると、


 「VPC」が、できてる!!!🎉🎊🎉

 わーい!わーい!わーい!😍
 🐣🐤🕊️🌟



 ということで、いろいろ準備は必要ですが、
 いざ実行すると、コマンド1行で「VPC」が構築できちゃいます。

 これ、いがっぺ?😆
 やってみっぺよ!😆

 実は「VPC」だけでなく、
 一緒にいろいろなオブジェクトも生成されているのですが、
 かな~り長くなってしまったので、そちらの説明はまた今度に。

 それでは、良き良き、AWS CDKライフを!!!🌈