Day 4 – 分析 AWS CDK sample-app

昨天說明完了指令的用法,今天來講解一下我們建立的 sample-app 裡面藏了什麼內容吧!

如果直接跳到這篇的同學可以直接使用 cdk init sample-app --language=typescript 跑出範例程式或是到 Day 2 – 第一個 AWS CDK 專案與參考資源分享 補一下內容呦!

今日內容主要說明怎麼使用 typescript 建立一個 CDK 應用與從頭到尾讀懂一隻基礎的 typescript 程式

進入點載入位置

先看到 bin/hello-cdk.ts

#!/usr/bin/env node
import * as cdk from '@aws-cdk/core';
import { HelloCdkStack } from '../lib/hello-cdk-stack';

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

程式講解

第 1 行

#!/usr/bin/env node

代表此文件使用 node 執行,那為什麼是這樣寫呢? 這就要從 #! 這個語法說起了,先說明它的名字叫做 Shebang 或是 Hashbang 通常 # 稱它為 sharp 而 ! 稱它為 bang 如此就知道為什麼是這個名字了吧! 此語法用於直接呼叫直譯器,說到這邊應該會有一個疑問竟然如此不是應該寫作?

#!/usr/bin/node

這樣其實不太完整以我現在使用的 MAC 來說

$ /usr/bin/node
zsh: no such file or directory: /usr/bin/node

會找不到 node 的位置那這時候就應該使用 env 指令執行它會去找使用者的 PATH 設定檔在再去執行 node

$ env node
Welcome to Node.js v14.8.0.
Type ".help" for more information.
>

第 2 ~ 3 行

引入我們的 Library

import * as cdk from '@aws-cdk/core';
import { HelloCdkStack } from '../lib/hello-cdk-stack';

第 5 行

使用 new 將物件建構起來

const app = new cdk.App();

第 6 行

把剛剛 new 起來的 cdk.App() 放入並取名 HelloCdkStack 未來後面會常常看到這樣的寫法

new HelloCdkStack(app, 'HelloCdkStack');

主要程式位置

看到 lib/hello-cdk-stack.ts

import * as sns from '@aws-cdk/aws-sns';
import * as subs from '@aws-cdk/aws-sns-subscriptions';
import * as sqs from '@aws-cdk/aws-sqs';
import * as cdk from '@aws-cdk/core';

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

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

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

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

第 6 行

export 一個 class 名稱 HelloCdkStack 繼承 cdk.Stack

export class HelloCdkStack extends cdk.Stack {}

第 7 行

透過 new 傳入的參數用 constructor 接收

constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {}

第 8 行

使用 super 得到父類別的值

super(scope, id, props);

第 10 ~ 12 行

新建一個 sqs queue 並且指定為 queue 設定 timeout 為 300 秒

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

第 14 行

新建一個 sns topic 並且指定為 topic

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

第 16 行

把 sns topic 加入到 sqs queue 中

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

以上是 CDK sample-app 的介紹如果有錯我會盡快修正的,謝謝大家!

明日的內容會說明如何把今日的 sample-app 部署上去 AWS,如果是在等如何部署的讀者就請在等我一天!