見出し画像

CDKを使ってAWSのSQSとSNSを作成する


はじめに

CDKを使ったAWSの構築を理解するために、一番シンプルな内容を確認します。構築するコードはデフォルトのままで使いますので、コマンドとファイルの関係性の整理が主になります。

サンプルコードの取得

cdkコマンドを実行して、サンプルコードを取得します。

mkdir sample-app
cd sample-app
cdk init sample-app --language typescript

実行するといろいろなコードが作成されますが、CDK関連の基本的なコードを3つ確認します。

cdk.json
モジュールの参照など色々ありますが、ここではappに設定されているbin/sample-app.tsに注目します。CDKでAWSを構築する際はこのcdk.jsonを参照して処理が行なわれますが、その中のbin/sample-app.tsがAWSの構築の本体となります。

{
  "app": "npx ts-node --prefer-ts-exts bin/sample-app.ts",
  "watch": {
    "include": [
      "**"
    ],
    "exclude": [
      "README.md",
      "cdk*.json",
      "**/*.d.ts",
      "**/*.js",
      "tsconfig.json",
      "package*.json",
      "yarn.lock",
      "node_modules",
      "test"
    ]
  },
  "context": {
    "@aws-cdk/aws-lambda:recognizeLayerVersion": true,
    "@aws-cdk/core:checkSecretUsage": true,
    "@aws-cdk/core:target-partitions": [
      "aws",
      "aws-cn"
    ],
    "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
   以下省略   
  }
}

bin/sample-app.ts
AWSの構築の本体ですが、さらにlib/sample-app-stack.tsに処理をいじょうしています。

#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import { SampleAppStack } from '../lib/sample-app-stack';

const app = new cdk.App();
new SampleAppStack(app, 'SampleAppStack');

lib/sample-app-stack.ts
Stackを継承したSampleAppStackがあり、constructorでSampleAppQueueとSampleAppTopicを作成し、addSubscriptionで紐付けを行なっているのが分かります。

import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as subs from 'aws-cdk-lib/aws-sns-subscriptions';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import { Construct } from 'constructs';

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

    const queue = new sqs.Queue(this, 'SampleAppQueue', {
      visibilityTimeout: Duration.seconds(300)
    });

    const topic = new sns.Topic(this, 'SampleAppTopic');

    topic.addSubscription(new subs.SqsSubscription(queue));
  }
}

初期化を行なう

CDKの構築を行なうためには初期化を実施する必要があります。
実行に際しては下記コマンドを使います。

cdk bootstrap --profile プロファイル名

このコマンドを実行するとAWS側ではCloudFormationが起動し、スタックにCDKToolkitが作成されます。

デプロイを行なう

lib/sample-app-stack.tsで定義した内容を構築するためには、下記コマンドを使います。

cdk deploy --profile プロファイル名

このコマンドを実行するとAWS側ではCloudFormationが起動し、スタックにCdkSampleStackが作成されます。名前がクラスメイト対応づけられていることからも関連が分かります。

SQSは下記の通り作成され、スタックのクラス名+SQSの名称となっています。

またSNSも下記の通り作成されています。
また詳細ではSQSとの紐付けも確認できます。

まとめ

CDKを用いたASWの構築ですが、試してみるとコードに記載されているままが実行されていることが分かり、思った以上に簡単に実施できます。
別途Lambdaの構築(Lambdaのコードをどう設定するか)も記載していく予定です。

補足

cdkにはdiffコマンドがあって、現在のAWS環境との差分を出してくれるものですがdockerを必要とするみたいです。
自分の環境では実行時にPermissionエラーが発生したので、記録を残しておきます。

エラー

ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied

エラー対処

sudo usermod -aG docker $USER
sudo chmod 666 /var/run/docker.sock

いいなと思ったら応援しよう!