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,如果是在等如何部署的讀者就請在等我一天!

Day 3 – AWS CDK 指令介紹

昨天講解了專案的創建今天來解釋基礎的 AWS CDK 指令,不過在講解之前應該要先跟大家說明怎麼使用 AWS CLI 不然在講解 AWS CDK 指令的時候有的指令可能會卡住

https://ithelp.ithome.com.tw/upload/images/20201024/20117701EhRLq1IeOZ.jpg

AWS CLI 安裝

使用 msi 安裝

首先先說明 Windows 的安裝方法,我個人覺得 Windows 是裡面最好安裝的只要到官方下載安裝檔即可 安裝後測試一下指令

C:\> aws --version
aws-cli/2.0.36 Python/3.7.4 Windows/10 botocore/2.0.0

詳細介紹可以參考官方安裝文件

Mac 安裝 AWS CLI

使用 brew 安裝

我通常在 Mac 上面盡可能指令都交給 brew 管理,所以我首推使用 brew 安裝指令,不過這不是官方推薦的方法,但是我比較喜歡

$ brew install awscli

使用 brew 在舊版 awscli@1 (a.k.a. AWS CLI version 1) 會有一個不太方便的地方是如果有改版內容想要先使用就算發 PR 也沒辦法被 merge 因為有規定 10 版做為一個單位

awscli should only be updated every 10 releases on multiples of 10

homebrew-core/Formula/[email protected]

新版的 awscli 就沒有這項規定了 homebrew-core/Formula/awscli.rb

使用 pkg 安裝

官方推薦的方法是使用 pkg 安裝,基本上安裝方法就是跟著安裝精靈走就好,其實也是滿方便的就看個人喜歡的方法囉

詳細介紹可以參考官方安裝文件

設定 AWS CLI

基礎 AWS configure 設定

安裝完後先來做 configure 設定,通常應該只有一個 AWS 帳號就直接使用如下設定就

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: 

AWS configure profile 設定

不過有的人可能因為工作關係有很多 AWS Account 總不可能每次都去挖自己的 Access Key,所以指令有提供 profile 的方法,感覺就像是多使用者的概念之後下指令只要把 profile 帶在後面就可以成功使用了

$ aws configure --profile ithome
AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
AWS Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: 

今天想要列出所有 ithome 這個 profile 的 S3 bucket 就可以使用

$ aws s3 ls --profile ithome

其他功能等後面需要再介紹給大家

AWS CDK Toolkit command

cdk init

昨天有介紹過 cdk init 指令了,不過還沒提到的是 init 除了 sample-app 的 Template 還有 applib,而如果不想要 Template 其實也可以直接執行 cdk init --language=typescript 就會是一個空專案了

$ cdk init --list
Available templates:
* app: Template for a CDK Application
   └─ cdk init app --language=[csharp|fsharp|java|javascript|python|typescript]
* lib: Template for a CDK Construct Library
   └─ cdk init lib --language=typescript
* sample-app: Example CDK Application with some constructs
   └─ cdk init sample-app --language=[csharp|fsharp|java|javascript|python|typescript]

cdk list

列出所有的 stack list,而為什麼以目前的範例來說會出現 HelloCdkStack 呢? 其實是因為我們的 bin/hello-cdk.ts 定義的,如果覺得指令太長可以改用 cdk ls

$ cdk list
HelloCdkStack

如果想要看更詳細的 stack 資料可以使用

$ cdk list --long
- id: HelloCdkStack
  name: HelloCdkStack
  environment:
    account: unknown-account
    region: unknown-region
    name: aws://unknown-account/unknown-region

cdk synthesize

看看目前程式產生的 CloudFormation 腳本可以直接使用這個指令,它的短指令是 cdk synth

$ cdk synth HelloCdkStack
Resources:
  HelloCdkQueueB56C77B9:
    Type: AWS::SQS::Queue
    Properties:
      VisibilityTimeout: 300
    Metadata:
      aws:cdk:path: HelloCdkStack/HelloCdkQueue/Resource
  HelloCdkQueuePolicy027FC30A:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Statement:
          - Action: sqs:SendMessage
            Condition:
              ArnEquals:
                aws:SourceArn:
                  Ref: HelloCdkTopic1F583424
            Effect: Allow
            Principal:
              Service: sns.amazonaws.com
            Resource:
              Fn::GetAtt:
                - HelloCdkQueueB56C77B9
                - Arn
        Version: "2012-10-17"
      Queues:
        - Ref: HelloCdkQueueB56C77B9
    Metadata:
      aws:cdk:path: HelloCdkStack/HelloCdkQueue/Policy/Resource
  HelloCdkQueueHelloCdkStackHelloCdkTopic850E0FBD36A066B9:
    Type: AWS::SNS::Subscription
    Properties:
      Protocol: sqs
      TopicArn:
        Ref: HelloCdkTopic1F583424
      Endpoint:
        Fn::GetAtt:
          - HelloCdkQueueB56C77B9
          - Arn
    Metadata:
      aws:cdk:path: HelloCdkStack/HelloCdkQueue/HelloCdkStackHelloCdkTopic850E0FBD/Resource
  HelloCdkTopic1F583424:
    Type: AWS::SNS::Topic
    Metadata:
      aws:cdk:path: HelloCdkStack/HelloCdkTopic/Resource
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Modules: aws-cdk=1.63.0,@aws-cdk/aws-cloudwatch=1.63.0,@aws-cdk/aws-iam=1.63.0,@aws-cdk/aws-kms=1.63.0,@aws-cdk/aws-sns=1.63.0,@aws-cdk/aws-sns-subscriptions=1.63.0,@aws-cdk/aws-sqs=1.63.0,@aws-cdk/cloud-assembly-schema=1.63.0,@aws-cdk/core=1.63.0,@aws-cdk/cx-api=1.63.0,@aws-cdk/region-info=1.63.0,jsii-runtime=node.js/v12.16.3
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
    Fn::Or:
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ca-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-northwest-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-central-1
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-2
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-3
          - Fn::Equals:
              - Ref: AWS::Region
              - me-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - sa-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-2
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-2

如果想要把目前的 CloudFormation templates 輸出成 yaml 也可以直接使用 cdk synth > output.yaml 或是以前是寫 JSON 的朋友也可以讓它輸出 JSON cdk synth --json > output.json 是不是很方便啊,不過我們現在使用 CDK 就是為了不想直接跟 CloudFormation 打交道就看看壞念一下吧 ~

cdk bootstrap

此指令是第一次要執行 cdk 部署前要執行的指令,它會在 S3 開啟一個 bucket 裡面會放有需要執行 CloudFormation 必要的東西

$ cdk bootstrap
 ⏳  Bootstrapping environment aws://888888888888/us-west-2...
 ✅  Environment aws://888888888888/us-west-2 bootstrapped (no changes).

cdk deploy

部署 CDK 腳本指令未來會常常用到它,詳細的使用方法等下一章再來說明

$ cdk deploy
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:

IAM Statement Changes
┌───┬───────────────────┬────────┬───────────────────┬───────────────────┬─────────────────────┐
│   │ Resource          │ Effect │ Action            │ Principal         │ Condition           │
├───┼───────────────────┼────────┼───────────────────┼───────────────────┼─────────────────────┤
│ + │ ${HelloCdkQueue.A │ Allow  │ sqs:SendMessage   │ Service:sns.amazo │ "ArnEquals": {      │
│   │ rn}               │        │                   │ naws.com          │   "aws:SourceArn":  │
│   │                   │        │                   │                   │ "${HelloCdkTopic}"  │
│   │                   │        │                   │                   │ }                   │
└───┴───────────────────┴────────┴───────────────────┴───────────────────┴─────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Do you wish to deploy these changes (y/n)?

文字版

https://ithelp.ithome.com.tw/upload/images/20200921/20117701pH38JyvBNI.png

圖片版

cdk destroy

因為 CDK 底層是 CloudFormation 的關係如果我們想要移除部署好的東西也可以輕易的把它移除的乾乾淨淨,只要使用這個指令即可達成

$ cdk destroy
Are you sure you want to delete: HelloCdkStack (y/n)? y
HelloCdkStack: destroying...

 ✅  HelloCdkStack: destroyed

cdk diff

在 CDK 裡面有一個很好用的功能就是 diff 我們可以輕易的知道現在的版本與已經部署的版本差異是什麼,只要使用 cdk diff 即可清楚的知道,以下面來說我們此範例會在 IAM 新增一個 Action sqs:SendMessage 與新增 4 個 Resources

$ cdk diff
IAM Statement Changes
┌───┬───────────────────┬────────┬───────────────────┬───────────────────┬─────────────────────┐
│   │ Resource          │ Effect │ Action            │ Principal         │ Condition           │
├───┼───────────────────┼────────┼───────────────────┼───────────────────┼─────────────────────┤
│ + │ ${HelloCdkQueue.A │ Allow  │ sqs:SendMessage   │ Service:sns.amazo │ "ArnEquals": {      │
│   │ rn}               │        │                   │ naws.com          │   "aws:SourceArn":  │
│   │                   │        │                   │                   │ "${HelloCdkTopic}"  │
│   │                   │        │                   │                   │ }                   │
└───┴───────────────────┴────────┴───────────────────┴───────────────────┴─────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Conditions
[+] Condition CDKMetadataAvailable: {"Fn::Or":[{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-northwest-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"sa-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-2"]}]}]}

Resources
[+] AWS::SQS::Queue HelloCdkQueue HelloCdkQueueB56C77B9 
[+] AWS::SQS::QueuePolicy HelloCdkQueue/Policy HelloCdkQueuePolicy027FC30A 
[+] AWS::SNS::Subscription HelloCdkQueue/HelloCdkStackHelloCdkTopic850E0FBD HelloCdkQueueHelloCdkStackHelloCdkTopic850E0FBD36A066B9 
[+] AWS::SNS::Topic HelloCdkTopic HelloCdkTopic1F583424 

文字版

https://ithelp.ithome.com.tw/upload/images/20200921/201177010nlP7lYF81.png

圖片版

cdk docs

如果想要快速的尋找文件就可以使用它,它會幫我們開啟瀏覽器並且帶我們到 https://docs.aws.amazon.com/cdk/api/latest/ 其實很方便 https://ithelp.ithome.com.tw/upload/images/20200918/201177012kpXQSWhy6.png

cdk doctor

如果有 bug 需要 report 的時候會需要指令此指令它會收集目前的 env 與 CDK 版本資訊

$ cdk doctor
ℹ️ CDK Version: 1.63.0 (build 7a68125)
ℹ️ AWS environment variables:
  - AWS_STS_REGIONAL_ENDPOINTS = regional
  - AWS_NODEJS_CONNECTION_REUSE_ENABLED = 1
  - AWS_SDK_LOAD_CONFIG = 1
ℹ️ No CDK environment variables

以上是 CDK 指令的介紹如果有錯歡迎跟我說我會盡快修正的,謝謝大家! 今天的內容就到此,明天會來講解

Day 2 – 第一個 AWS CDK 專案與參考資源分享

昨天談完了為什麼想要學習 AWS CDK,今天就來建立屬於自己的第一個 AWS CDK 專案吧! 建立完成後跟大家談談學習 AWS CDK 有什麼資源可以看吧!

https://ithelp.ithome.com.tw/upload/images/20201022/20117701YfzE0FyUyP.jpg

建立我的第一個 AWS CDK 專案

安裝指令

  • 確認 NodeJS
$ node -v
v14.8.0

Node.js 版本需求 ≥ 10.13.0

  • 確認 NPM
$ npm -v
6.14.8
$ npm i -g aws-cdk
  • 建立專案資料夾
$ mkdir hello-cdk && cd hello-cdk
  • 初始化專案
$ cdk init sample-app --language=typescript

Applying project template sample-app for typescript
# Welcome to your CDK TypeScript project!

You should explore the contents of this project. It demonstrates a CDK app with an instance of a stack (`HelloCdkStack`)
which contains an Amazon SQS queue that is subscribed to an Amazon SNS topic.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
npm WARN deprecated [email protected]: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN [email protected] No repository field.
npm WARN [email protected] No license field.

✅ All done!

指令詳細介紹:

  • 建立專案:cdk init sample-app –language=typescript
  • 初始化模板 sample-app:cdk init sample-app –language=typescript
  • 語言 typescript:sample-app cdk init sample-app –language=typescript

開啟專案

$ code .

https://ithelp.ithome.com.tw/upload/images/20200917/20117701Yh3Af7atRI.png

建議安裝 AWS Toolkit https://ithelp.ithome.com.tw/upload/images/20200917/20117701ecG9hcHP1W.png

資料夾檔案介紹

https://ithelp.ithome.com.tw/upload/images/20200917/201177016yYXkWkYSu.png

  • lib/cdk-workshop-stack.ts:CDK 主要的程式位置
  • bin/cdk-workshop.ts:主要的程式進入點預設會引用 lib/cdk-workshop-stack.ts
  • package.json:npm 模組清單裡面定義了套件的版本與指令,例如:buildwatchtestcdk
  • cdk.json:告訴 toolkit 如何執行 app
  • tsconfig.json:typescript 設定檔
  • .gitignore:告訴 git 應該要排除的文件
  • .npmignore:告訴 npm 應該要排除的文件
  • node_modules:nodejs 套件包執行完 npm install 後的文件都會安裝在此資料夾裡面
  • test:CDK 測試的程式位置

參考資源

  • AWS 文件 首先要跟大家說明的是 AWS 文件,文件會從 What is the AWS CDK? 開始介紹,目前只有英文介紹可能會比較深澀一點,後面的文章如果有需要會引用裡面的內容來說明

  • AWS CDK Workshop AWS CDK Workshop 內容是一個 Workshop 會從 Lambda、API Gateway、DynamoDB、CloudWatch 一步步教你如何做出一個簡單的 Web 服務,最後會說明怎麼把剛剛建立的服務給移除

  • AWS CDK Github AWS CDK 為一個 Open Source Project 因此所有的程式碼都可以從這邊找到,如果遇到了問題也可以直接發 issue 給官方詢問,有新的想法或是 BUG 修復也可以直接發送 PR

  • Pahud Dev Youtube 頻道 AWS CDK 影片目前有 11 支 4K 高畫質影片不是文字派就看影片吧! Pahud – Developer Advocate – AWS

Day 1 – 一起學習 AWS Cloud Development Kit (AWS CDK)

https://ithelp.ithome.com.tw/upload/images/20201019/20117701PWxRmGljdw.jpg

前言

開賽第一天先來跟大家聊聊為什麼想要學習 AWS Cloud Development Kit (AWS CDK),如果用過 AWS 的使用者應該都知道如果要在 AWS 建構一個雲端基礎架構(IaC)有以下兩種方法

  1. 手動建立
  2. AWS CloudFormation

手動建立

這是最基礎的方法,相信大家跟我一樣一開始都是使用這個方法學習 AWS 的,使用這個方法沒有問題,不過問題是如果今天收到的需求是一次建立 10 台 EC2 並且都是不一樣 type 的 EC2 相信會是一個按到手酸的節奏,而且不小心手滑可能會建立錯或是忘記自己建立到哪一台就是一個一直做重複動作的節奏

AWS CloudFormation

如果使用這個方法可以先寫好腳本並且可以在部署前先 Review,基本上就可以解決上面提出的問題了,不過有個美中不足是 CloudFormation 腳本寫起來本身不太好閱讀,因為他就是一串 JSON 或是 YAML,如果有寫過就知道有時候寫一寫會不清楚自己在寫什麼,而且還沒有註解功能 (╥﹏╥)

簡單介紹 AWS CDK

https://ithelp.ithome.com.tw/upload/images/20200916/201177010TWDfhzFsh.png

為了解決這個問題 AWS 就在 2019-07-11 發佈了第一版的 AWS 雲端開發套件 (AWS CDK),也就實作了基礎架構即代碼(IaC)讓 CloudFormation 可以用程式碼來寫解決了很多問題像是

  • 可以撰寫測試腳本
  • 不用定義繁瑣的 AWS IAM (Identity and Access Management)
  • 目前的部署腳本與上一版先做差異分析
  • 如果有服務 ID 需要給予下一個服務也可以直接處理

文章目錄

以下是我 30 天鐵人賽文章的總整理,如果沒時間一篇一篇看可以直接挑自己喜歡的主題下去看: