AWS CDKを導入してSNSトピックを作成してみる
今まで、マネジメントコンソールをメインにAWSを操作してきました。
しかし、クラウドのメリットの一つとしてInfrastructure as Code、つまりリソースをコードで管理できる点が挙げられると思います。そこで、AWS CDK(AWS Cloud Development Kit)を導入してコードによるリソース管理を本格的に学んでいきたいと考えました。
AWS CDKとは?
簡単にいうと、プログラミングをするようにリソースを作ることができる仕組みです。
Infrastructure as Codeといえば、真っ先に思いつくのはCloudFormationです。しかしCloudFormationテンプレートはJSONまたはYAML形式なので、長くなってしまったり見づらくなったりしてしまうというデメリットがありました。
そこで登場したのがAWS CDKです。
導入方法
AWS CLIはインストールしてアカウントをセットアップ済みであることを前提とします。公式サイトにインストール方法が書いてありますので参照してください。
また、Node.jsもインストールされていることを前提とします。この記事の内容はv16.12.0がインストールされている環境で行っています。
AWS CDK CLIのセットアップ
まずAWS CDKをインストールします。以下のコマンドを実行します。
npm install -g aws-cdk
インストールされたことを確認するには、以下のコマンドを実行します。
cdk --version
私の環境では、「2.28.1 (build d035432)」と表示されました。
次に、AWSアカウントのブートストラップを行います。ブートストラップとは、CDKで様々なリソースをデプロイするときにアップロードする先のS3バケットを作成することです。最初の1回だけ必要です。
まず、AWS CLIに設定済みのアカウント情報を取得し、それからブートストラップコマンドを実行します。アカウントIDとリージョン名がわかっている場合は、取得は飛ばしても良いです。
aws sts get-caller-identity
{
"UserId": "*****",
"Account": "************",
"Arn": "arn:aws:iam::************:user/****"
}
cdk bootstrap aws://************/ap-northeast-1
少し時間がかかりますが、チェックマークのついたメッセージが表示されれば完了です。
プロジェクトの作成
CDKプロジェクトを作成します。あらかじめプロジェクト用のフォルダを作っておき、そこで以下のコマンドを実行します。
cdk init --language typescript
今回はTypeScriptにしましたが、PythonやJavaなども使えるみたいです。
しばらくすると、プロジェクトフォルダ内にいくつかファイルが作成されます。このファイルをカスタマイズしてリソースを作っていきます。
ひとまず使用するファイルはlib/配下に作成されたtsファイルです。ここに作成したいリソースをバンバン書いていくことになります。今回はSNSトピックとサブスクリプションを作っていきたいと思います。
リソースの定義
SNSトピックとサブスクリプションを作りたいので、まずは必要なモジュールをインポートします。といってもimport文を書くだけです。上の2行はデフォルトで書いてあると思いますので、下2行を追加します。
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as sub from 'aws-cdk-lib/aws-sns-subscriptions';
ちなみに、ネットの記事によっては、
import * as sns from '@aws-cdk/aws-sns'
のように、アットマークから始まる各パッケージを個別にインストールする方法で書かれている記事もあると思います。これはAWS CDKのバージョンの違いによります。バージョン2からはパッケージの個別インストールがいらなくなって、上記のような書き方で良くなったみたいです。
次にリソースの定義です。デフォルトの状態で以下のようになっていると思います。
export class CdkDemoStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// The code that defines your stack goes here
// example resource
// const queue = new sqs.Queue(this, 'CdkDemoQueue', {
// visibilityTimeout: cdk.Duration.seconds(300)
// });
}
}
ここに4行ほど追加します。メールアドレスの部分は自分のものに変更してください。
export class CdkDemoStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const topic = new sns.Topic(this, 'topic-email', {
topicName: 'test-email-topic',
});
topic.addSubscription(new sub.EmailSubscription('******@gmail.com'));
// The code that defines your stack goes here
// example resource
// const queue = new sqs.Queue(this, 'CdkDemoQueue', {
// visibilityTimeout: cdk.Duration.seconds(300)
// });
}
}
これで、「test-email-topic」というトピックと、そのトピックにサブスクリプションが追加された状態のリソースを定義することができました。
デプロイ
デプロイするには以下のコマンドを実行します。
cdk deploy
すると、プロジェクトフォルダ内にcdk.outというフォルダが作成されます。中には自動生成されたCloudFormationテンプレートが含まれています。
AWS CDKはCloudFormationを使っているので、コードからまずCloudFormationテンプレートを生成し、スタックをデプロイするという仕組みになっているからです。
デプロイが完了すると、サブスクリプションとして設定したメールアドレスに確認メールが送信されると思います。メール内の「Confirm subscription」をクリックすればサブスクリプションが有効になります。
また、マネジメントコンソールでCloudFormationを見てみると、新たに今作ったスタックが表示されていることがわかります。SNSにも「test-email-topic」というトピックが増えていますね。
まとめ
AWS CDK、とても楽しい!書いたコードの通りにリソースが作られるのは見ていて気持ちが良いです。
もっと使いこなして、便利で快適なAWSライフを送れるように今後も勉強していきます!