継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

年末年始にこそたくさん学ぼう! AWS のサービス別ワークショップの紹介

タダです.

2019年の年の瀬ですが,みなさんいかがお過ごしでしょうか.年末年始で時間ができたので普段できない勉強や作業に使ってみたり,何かネタを探す方もいるかもしれません.そんな方々向けに AWS が無料で提供しているワークショップをサービス別で紹介します.特に,re:Invent 2019 で公表されたワークショップもありますので,re:Invent 2019 に参加できていない方も学びを通じて楽しめると思います!

Compute

EC2 Spot Instance

EC2 Spot Instances Workshops Site ec2spotworkshops.com

EC2 Spot Instances Workshopp Repository github.com

Lightsail

Amazon Lightsail Workshop Site lightsailworkshop.com

Container

Fargate

Amazon ECS Workshop for AWS Fargate Site ecsworkshop.com

Amazon ECS Workshop for AWS Fargate Repository github.com

EKS

Amazon EKS Workshop Site eksworkshop.com

Amazon EKS Workshop Repository github.com

re:Invent 2019 公表コンテンツ

CON317 - Securing your EKS github.com

NET403: Amazon EKS and Kubernetes on EC2 Container Networking Workshop Site awsk8snetworkshops.com

Amazon EKS and Kubernetes on EC2 Container Networking Workshop GitHub Repository github.com

AppMesh

AWS App Mesh Workshop Site www.appmeshworkshop.com

AWS App Mesh Workshop Repository github.com

Storage

DataSync

NFS server migration using AWS DataSync and AWS Storage Gateway github.com

Database

DMS

DMS での Aurora,DynamoDB への移行とアプリケーション構築の実践 github.com

re:Invent 2019 公表コンテンツ

AWS Database Migration Workshop github.com

Redshift

Redshift Exercises github.com

Security

AWS Security Workshops Site awssecworkshops.com

日本語版サイト awssecworkshops.jp

AWS Security Workshops Repository github.com

re:Invent 2019 公表コンテンツ

OPN215 - Intelligent Automation with AWS and Snort IDS github.com

SEC404 - Building Secure APIs in the Cloud Site workshop.reinvent.awsdemo.me

Management Tools

Service Catalog

re:Invent 2019 公表コンテンツ

Service Catalog tools workshop at re:Invent 2019 Site service-catalog-tools-workshop.com

AWS CDK

Building a Serverless Application with the AWS Cloud Development Kit github.com

日本語の解説サイト aws.amazon.com

re:Invent 2019 公表コンテンツ

ARC321 - Builders Workshop github.com

DOP336 - Serverless app infrastructure with the AWS Cloud Development Kit (AWS CDK) github.com

AWS Management Tools

AWS Management Tools Lab(AWS Service Catalog, AWS Systems Manager, AWS Config, AWS CloudWatch, AWS CloudTrail, AWS CloudFormation) www.awsmanagementweek.com

Control Tower

Control Tower Exercise Labs controltower.aws-management.tools

Well-Architected Framework

AWS Well-Architected Labs SIte wellarchitectedlabs.com

AWS Well-Architected Labs Repository github.com

Mobile

Amplify

re:Invent 2019 公表コンテンツ

AWS re:Invent 2019 Mobile Workshops github.com

Serverless

Lambda, API Gateway, Step Functions,Serverless Application Repository etc

Wild Rydes Serverless Workshops GitHub Repository github.com

Serverless Security Workshop github.com

.NET web application based on decoupled architecture github.com

Serverless Image Processing: Workshop image-processing.serverlessworkshops.io

AWS Workshop on Microservices www.microservicesworkshop.com

re:Invent 2019 公表コンテンツ

SVS201 - Build a serverless web app for a theme park github.com

SVS217 - Package your app for the AWS Serverless Application Repository github.com

SVS203 - AWS Lambda, Amazon API Gateway, Amazon S3, Amazon DynamoDB, Amazon Cognito, and AWS Amplify Console WorkShop webapp.serverlessworkshops.io

Robotics

RoboMaker

Robomaker Workshops github.com

Alexa

AWS & Alexa Workshop Site alexaworkshop.com

AWS & Alexa Workshop Repository github.com

Voice Robotics Workshop voiceroboticsworkshop.com

Search

Amazon Elasticsearch Service

re:Invent 2019 公表コンテンツ

re:Invent Elasticsearch Workshops Site reinvent.aesworkshops.com

AI

SageMaker

re:Invent 2019 公表コンテンツ

AIM362 - Build, train & debug, and deploy & monitor with Amazon SageMaker github.com

AIM361 - Hyperparameter Optimization and AutoML gitlab.com

Amazon SageMaker Autopilot – Automatically Create High-Quality Machine Learning Models With Full Control And Visibility Blog aws.amazon.com

AIM403 - Deep learning with Apache MXNet github.com

AWS DeepComposer

re:Invent 2019 公表コンテンツ

AWS DeepComposer workshop github.com

DeepRacer

DeepRacer workshop content github.com

DeepLens

re:Invent 2019 公表コンテンツ

AWS DeepLens Workshops github.com

Sumerian

Sumerian AR Webapp Workshop Site workshop-sumerian-ar-webapp.s3-website-eu-west-1.amazonaws.com

Blockchain

Amazon Managed Blockchain

re:Invent 2019 公表コンテンツ

Build an interbank transfer solution using Hyperledger Fabric on Amazon Managed Blockchain github.com

IoT

FreeRTOS, AWS IoT

Connected Drink Dispenser Workshop github.com

re:Invent 2019 公表コンテンツ

IOT335 - Implementing multi-region AWS IoT github.com

IOT405 - Performing Analytics at the Edge with AWS IoT Greengrass github.com

Others

re:Invent 2019 公表コンテンツ

AWS Builder’s Fair Project Sample Code and Documentation github.com

AWS re:Invent 2019 Trivia Game アーキテクチャを学ぶ

ワークショップではないですが,上記のイベント用サイトとそのコードが公開されているため re:Invent 2019 コンテンツとして載せます.

AWS re:Invent 2019 Trivia Game Site www.reinvent-trivia.com

GitHub Repository github.com

まとめ

リンクを紹介だけでしたがたくさんのコンテンツがありました.特に,AI とServerless のコンテンツの多さにこれらの領域の注力しているのが感じられます.個人的には Container,Database,AI,Management Tools が気になるので触ってみたいですね.この記事で紹介したものが年末年始の勉強の一助になれば嬉しいです.

関連記事

re:Invent 2019 関連の記事としてこちらもぜひ! sadayoshi-tada.hatenablog.com

2019年の振り返りと2020年の抱負

タダです。

2019年も今日で終わりなので,今年の振り返りと来年の抱負を書きたいと思います.

目標の振り返り

まずは,昨年末に立てた目標を振り返ってみます.5つ中2つ達成した状況でした.未達の目標は来年の目標で挑戦するよう試みていくようにしていきます.

sadayoshi-tada.hatenablog.com

No. 目標概要 アクション 結果
1 継続的アウトプットとの継続 週に1本以上の記事を継続 達成
2 読み手を意識するアウトプット はてブ総数や記事シェアなど気にする 達成
3 今年手を広げた新しい技術の深堀 今年手を広げたのはやりたい領域なので引き続き実践力をつけていければと思います。
・Docker / Kubernetes の使い方、インフラの知識の理解を深める、普段使いにする
・CloudFormation, Ansible, Terraformの勉強継続と、実戦投入する
ビッグデータ機械学習等のデータ分析は机上の勉強だけでなく Kaggle や SIGNATE といったコンペに参加する
・CI/CD のツールを使ってみて経験を積む
2/4達成
4 自分の武器を1つ作る Python を使ったデータ分析のプロジェクトに自分を入れてもらえるようにする。
・Web サービスのポートフォリオを最低1つ作る。
1/2 達成
5 セキュリティ、データベース領域が弱いため弱点強化 専門書を購入して資格試験やコンペなどで実力を確認 未達

ブログの振り返り

ブログは何と言ってもカックさん( id:kakku22) のブログメンタリングを今年のはじめに受け始めてから状況が変わりました.ブログを書いてフィードバックをもらって改善するサイクルが回ってブログや SNS での反応が変わっていったのを実感しました.刺激的かつ濃厚な3ヶ月だったなと感じます.ブログを力を入れ始めて人との出会いも増えたし,ブログ書いている人(特に AWS のブログ)って認識してもらえるようになりました.自分が継続的なアウトプットをすることで自分の実力を鍛えていき,周りの人からも認識してもらえるようになれたら初だったので嬉しかったし,RPG のようなレベル上げしているようで自分に合っていると思います.今後もコツコツ続けていきます.

定期的なアウトプットの継続

継続的アウトプット」は継続できており,ブログの継続期間が104週と続けてこれています.ルーティン化されたのでブログ書かないともやもやする身体にはなりましたw

ホッテントリの増加

昨年に比べてホッテントリの数も増えたのですが,メンタリング中に100ブクマ,メンタリング後に200ブクマを超える記事が出たのが一番の成果ですね.それだけ求められる記事をかけたと思い自信になりました.

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

b.hatena.ne.jp

Twitter のフォロワーと読者数の増加

Twitter のフォロワーも年間で167人増え,はてなブログの読者数も年間で35人増えました.ホッテントリと同じで興味を持ってもらえる方が増えて本当に嬉しかったです.

課題

一方で年間を通じてブログの PV 数が平均2,500ほどでした.読み手を意識した記事を作るときにはてブ数や SNS の反応を主に気にしていたのですが,その反応がなくても見られる記事,見続けられる記事にしていくために自分のブログの PV 数も意識が必要だと改めて感じました.そのために,ネタや中身もブログメンタリングで受けた指摘振り返ったり他の人がどんな書き方をしているかも研究していきます.

f:id:sadayoshi_tada:20191231003959p:plain

来年の抱負

2020年の抱負は以下の通りです。来年はデータ分析,クラウドネイティブ(まずはコンテナ)に注力していき,そのアウトプットをブログにしていきます.

No. 目標概要 アクション 結果
1 読み手を意識するアウトプット ホッテントリ入りする記事をを作る(2019年はホッテントリ数が16記事なので20記事を目指す)
月間のPV数を平均3,000超えを目指す
-
2 データ分析コンペに1人で参加できるようになる Kaggleのコンペに一人で参戦して1人でモデルや特徴量を作っていけるようになる Kaggler になるのが自分のキャリアでやりたいことではないと思い,アクションから除外した
3 クラウドネィティブなアーキテクチャ設計と実装,運用に関する理解を深める クラウドネイティブなアーキテクチャの設計や運用していくための書籍や講座を通して理解を深める
特にコンテナ技術はクラウドだけでなく,データ分析の文脈でも登場する技術のため理解し扱えるようになりたい
-
4 データベース領域の強化 データベースに対する苦手意識をなくすために資格試験を取り実力を形に残していく -

まとめ

2020年も現状維持じゃなくて成長を意識して行動していきます.

ビッグデータ専門知識を証明する『AWS 認定 Bigdata Speciality』に合格するためにやったこと

タダです.

12/28 に AWS 認定 Bigdata Speciality に合格しました.今回は自分がどんな勉強をしていったかを振り返り,今後受験される方の勉強の参考になれば嬉しいです.

試験範囲について

試験範囲については試験のガイドで確認できます.サンプル問題ではどのような問われ方がされるかが参考になると思います.

aws.amazon.com

また,試験の準備ページ内にラーニングパスについて解説されていますのでこちらも参考になります.

aws.amazon.com

試験勉強で注力したこと

次に,僕が注力して勉強したことをまとめていきます.大きく3つのことをやりました.

1.ビッグデータの関連用語や関連技術が生まれた経緯を学ぶ

僕はビッグデータの関連用語や関連技術について存在は知っていてもなんで Hadoop や NoSQL をはじめとした技術が出てきた経緯について知りませんでした.ビッグデータの業務経験がないような方やこれから勉強していく方にとってはこの本から始めるのがオススメです.何でビッグデータの関連技術が登場していたのかを攫いながら2以降の勉強を行うと僕は頭に入ってきやすかったです.

ビッグデータを支える技術―刻々とデータが脈打つ自動化の世界 (WEB+DB PRESS plus)

ビッグデータを支える技術―刻々とデータが脈打つ自動化の世界 (WEB+DB PRESS plus)

2. ビッグデータ関連のサービスの理解を深める

AWSビッグデータ関連のサービスが紹介されているためこのページに載っているサービスを中心にドキュメントやよくある質問,サービス別資料を確認して理解を深めました.ビッグデータの収集,保存,処理,分析のそれぞれのサービスごとに整理するとよいでしょう. aws.amazon.com

Youtube 動画

ドキュメントなどで理解が深まらない場合は,AWS 公式の Youtube チャンネルの動画が理解をサポートしてくれます.特に,Redshift 関連のトピックに僕が弱かったので Redshift の動画を中心に観ました.

www.youtube.com

www.youtube.com

www.youtube.com

www.youtube.com

ホワイトペーパー

ビッグデータのホワイトペーパーとして AWS でのビッグデータ分析オプション がリリースされています.関連サービスの特徴やユースケースを学ぶことができます.また,連携するサービスについても整理していくのに役立ちます.

3. 先人の経験に倣う

最後は,過去に合格された方の勉強方法に倣っていくことをやりました.試験がリリースされてからだいぶ経ったので,他にも合格者の方の記事がありました.僕は以下の記事を参考にさせてもらって勉強してきました.

yomon.hatenablog.com

qiita.com

qiita.com

まとめ

次は,Security Speciality か Machine Learning Speciality に挑みたいと思います!

Toggl のスマートな時間記録をサポートするワークフローの『Alfred-time』

タダです.

タイムマネジメントと時間の使い方見直しのために Toggl で自分がどんなことに時間を使っているかを記録していってます.Toggl は様々なデバイスでのアプリケーションがあるのですが,僕は普段パソコン作業の時間が多いため, Mac の Desktop アプリを入れています.アプリケーションの通常の利用ですとアプリケーションの画面を都度開いてどの作業に時間を使っているかを記録の開始と停止操作を行いますが,記録の開始と終了をやりやすくする方法として Alfred Workflow の「Alfred-time」をこの記事で紹介します.

Desktop App toggl.com

Alfred-time について

Alfred-time」は, Toggl の他に Harvest や Everhour といったサービスの時間管理を支援する Alfred Workflow になります.アプリケーションの操作を画面で都度操作するよりもキーボードの操作でタスクの開始と終了を記録可能になるため普段のオペレーションと平行で行えます.普段のキーボード操作以外のオペレーションがなくなる(GUI アプリケーションの操作が不要になる)ため時間記録の心理的ハードルが下がるメリットがあると思います.

github.com

なお,Alfred Workflow を使うために Alfred を別途入れておく必要がありますので,セットアップできてない方は別途導入ください. www.alfredapp.com

Alfred-time の利用準備

それではまず「Alfred-time」を利用するためのセットアップを説明します.最初にReleases よりTime.alfredworkflowをローカルマシンにダウンロードします.Time.alfredworkflowをダウンロード後にダブルクリックすると,Alfred Workflow のインポート画面が起動しますのでインポートします.

github.com

Alfred Workflow のインポート画面 f:id:sadayoshi_tada:20191224031401p:plain

インポート後,初期設定を行います.timeコマンドで Workflow が起動しますので,Setup the workflowを選びます. f:id:sadayoshi_tada:20191224031648p:plain

次にSetup Togglを選んだ後,Toggl の API Token を反映します.これで初期設定が完了です. f:id:sadayoshi_tada:20191224031706p:plain f:id:sadayoshi_tada:20191224031919p:plain

なお, Toggl の API Token は Toggl のプロフィール画面の最下部にあります. f:id:sadayoshi_tada:20191224032155p:plain

Alfred-time の使い方

初期設定後,どう「Alfred-time」で時間記録の開始と終了を行うかを紹介します.

タスクの開始はtime <タスク名>で起動します.その後,どのプロジェクトに紐づけるか,タグを設定するかを選択後,タスク起動します.画像ではブログの作業の時間記録の開始する場合のコマンド入力例を載せています.

ブログの時間記録を開始する f:id:sadayoshi_tada:20191224033510p:plain プロジェクトの選択 f:id:sadayoshi_tada:20191224033518p:plain タグの選択 f:id:sadayoshi_tada:20191224033529p:plain

タスクの終了時はStop current timerでタスクの終了を記録できます. f:id:sadayoshi_tada:20191224034350p:plain

まとめ

Alfred-time」の導入と使い方を紹介しました.いかがでしょうか.アプリケーションの GUI で都度起動と停止の操作をするよりも利用のハードルが下がるなと感動したツールと思います.このツールを使うことで Toggl の時間記録が効率的に行うことができるためまだ使っていない方や今後利用検討をする方は「Alfred-time」の利用をオススメします!

AWS CDK のインフラストラクチャテストフレームワーク『Jest』での『Snapshot tests』実践

タダです.

来年の技術書典8に出ることが決まりました! テーマは AWS CDK の本です.AWS CDK の本を出すからこそむちゃくちゃ詳しくなれるようにより一層使い込みと勉強をしていきます.今回の記事では,テストフレームワークJest」の使い方を学びます.

AWS CDK におけるテストの現状

ドキュメントを見ると,テストでサポートされているのは TypeScript のみになります.「Jest」は JavaScript テストフレームワークAWS CDK の TypeScript のテストも可能です.

jestjs.io

テストの種類について

AWS CDK のテストには次の3種類の方法があります.今回は 「Snapshot tests」のやり方を学びます.「Snapshot tests」とは 作りたい CloudFormation テンプレート全体を準備して AWS CDK で作成したテンプレートが一致することを確認するためのテストです.AWS CDK の開発においては Integration test として利用されているそうです.

  • Snapshot tests(Golden master tests)
  • Fine-grained assertions tests
  • Validation tests

「Jest」の導入

それでは「Jest」の実践を公式ブログのチュートリアルに沿って使ってみます.公式ブログによると,AWS CDK の TypeScript の Construct ライブラリには @aws-cdk/assert というアサーションライブラリがあります.

aws.amazon.com

なお,環境は以下になります.

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G2022
$ cdk --version
1.19.0 (build 5597bbe)

チュートリアル用プロジェクトの準備

チュートリアル用のプロジェクトを準備します.チュートリアルでは,SQS のデッドレターキューにアイテムがある場合にアラーム通知するよう CloudWatch を設定するケースのインフラとテストのコードを作ります.

$ cdk init --language typescript lib
Applying project template lib for typescript
Executing npm install...
npm WARN deprecated left-pad@1.3.0: use String.prototype.padStart()
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN jest-handson@0.1.0 No repository field.
npm WARN jest-handson@0.1.0 No license field.

# Welcome to your CDK TypeScript Construct Library project!

You should explore the contents of this project. It demonstrates a CDK Construct Library that includes a construct (`JestHandson`)
which contains an Amazon SQS queue that is subscribed to an Amazon SNS topic.

The construct defines an interface (`JestHandsonProps`) to configure the visibility timeout of the queue.

## 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
$ npm install @aws-cdk/aws-sqs @aws-cdk/aws-cloudwatch
npm WARN jest-handson@0.1.0 No repository field.
npm WARN jest-handson@0.1.0 No license field.

+ @aws-cdk/aws-sqs@1.19.0
+ @aws-cdk/aws-cloudwatch@1.19.0
updated 2 packages and audited 1755462 packages in 11.635s

14 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

Snapshot tests の実践

インフラソースコードの準備

デッドレターキューを構成するソースコード

import cloudwatch = require('@aws-cdk/aws-cloudwatch');
import sqs = require('@aws-cdk/aws-sqs');
import { Construct. Duration } from '@aws-cdk/core';

export class DeadLetterQueue extends sqs.Queue {
    public readonly messagesInQueueAlarm: cloudwatch.IAlarm;

    constructor(scope: Construct, id: string) {
        super(scope,id);

        // Add the alarm
        this.messagesInQueueAlarm = new cloudwatch.Alarm(this, 'Alarm', {
            alarmDescription: 'There are messages in the Dead Letter Queue',
            evaluationPeriods: 1,
            threshold: 1,
            metric: this.metricApproximateNumberOfMessagesVisible(),
        });
    }
}

テストコードの準備

Jest」と AWS CDK アサーションライブラリをインストールします.

$ npm install --save-dev jest @types/jest @aws-cdk/assert
npm WARN deprecated left-pad@1.3.0: use String.prototype.padStart()
npm WARN jest-handson@0.1.0 No repository field.
npm WARN jest-handson@0.1.0 No license field.

+ jest@24.9.0
+ @types/jest@24.0.24
+ @aws-cdk/assert@1.19.0
updated 3 packages and audited 1755462 packages in 35.82s

1 package is looking for funding
  run `npm fund` for details

found 0 vulnerabilities

package.json に「Jest」に関する定義を記載します.

{
  "name": "jest-handson",
  "version": "0.1.0",
  "main": "lib/index.js",
  "types": "lib/index.d.ts",
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest" <= 定義が必要
  },
  "devDependencies": {
    "@aws-cdk/assert": "^1.19.0",
    "@types/jest": "^24.0.24",<= 定義が必要
    "@types/node": "10.17.5",
    "jest": "^24.9.0",<= 定義が必要
    "ts-jest": "^24.1.0",
    "typescript": "~3.7.2"
  },
  "jest": {
    "moduleFileExtensions": ["js"]<= 定義が必要
  },
  "peerDependencies": {
    "@aws-cdk/core": "^1.19.0"
  },
  "dependencies": {
    "@aws-cdk/aws-cloudwatch": "^1.19.0",
    "@aws-cdk/aws-sns": "^1.19.0",
    "@aws-cdk/aws-sns-subscriptions": "^1.19.0",
    "@aws-cdk/aws-sqs": "^1.19.0",
    "@aws-cdk/core": "^1.19.0"
  }
}

テストコードのコンパイルと実行

ライブラリとpackage.json の定義が完了したら,テスト用のコードを書いていきます.キューの保持期間が2週間であることを確認するコードを書くのですが,今回は「Snapshot tests」を書きます.

import { SynthUtils } from '@aws-cdk/assert';
import { Stack } from '@aws-cdk/core';

import dlq = require('../lib/dead-letter-queue');

test('dlq creates an alarm', () => {
    const stack = new Stack();
    new dlq.DeadLetterQueue(stack, 'DLQ');
    expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot();
})

テストコードを書き終えたらテストコードをコンパイルして,ユニットテストを実行します.

$ npm run build                                          

> jest-handson@0.1.0 build /XXX/XXX/awscdk-handson/jest-handson
> tsc

lib/dead-letter-queue.ts:3:19 - error TS1005: ',' expected.

3 import { Construct. Duration } from '@aws-cdk/core';
                    ~


Found 1 error.

npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! jest-handson@0.1.0 build: `tsc`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the jest-handson@0.1.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /XXX/XXX/.npm/_logs/2019-12-21T07_25_41_525Z-debug.log
$ npm run build

> jest-handson@0.1.0 build /XXX/XXX/awscdk-handson/jest-handson
> tsc
$ npm test

> jest-handson@0.1.0 test /Users/tada/awscdk-handson/jest-handson
> jest

 PASS  test/dead-letter-queue.test.ts
  ✓ dlq creates an alarm (132ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   1 passed, 1 total
Time:        5.396s, estimated 12s
Ran all test suites.

ユニットテストが終わると,test/__snapshots__というディレクトリができており, テストファイル名.test.ts.snap というCloudFormation テンプレートコピーが生成されます.

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`dlq creates an alarm 1`] = `
Object {
  "Resources": Object {
    "DLQ581697C4": Object {
      "Type": "AWS::SQS::Queue",
    },
    "DLQAlarm008FBE3A": Object {
      "Properties": Object {
        "AlarmDescription": "There are messages in the Dead Letter Queue",
        "ComparisonOperator": "GreaterThanOrEqualToThreshold",
        "Dimensions": Array [
          Object {
            "Name": "QueueName",
            "Value": Object {
              "Fn::GetAtt": Array [
                "DLQ581697C4",
                "QueueName",
              ],
            },
          },
        ],
        "EvaluationPeriods": 1,
        "MetricName": "ApproximateNumberOfMessagesVisible",
        "Namespace": "AWS/SQS",
        "Period": 300,
        "Statistic": "Maximum",
        "Threshold": 1,
      },
      "Type": "AWS::CloudWatch::Alarm",
    },
  },
}
`;

インフラソースコードを変更した場合の「Snapshot tests」の実践

インフラのソースコードを変更した時はどのように再度テストを行うのでしょうか.その方法もみておきます.

CloudWatch Alarm の 間隔をデフォルト5分から1分に変更

インフラのソースコードの CloudWatch Alarm の 間隔をデフォルト5分から1分に変更して再度「Snapshot tests」を行います.

import cloudwatch = require('@aws-cdk/aws-cloudwatch');
import sqs = require('@aws-cdk/aws-sqs');
import { Construct, Duration } from '@aws-cdk/core';

export class DeadLetterQueue extends sqs.Queue {
    public readonly messagesInQueueAlarm: cloudwatch.IAlarm;

    constructor(scope: Construct, id: string) {
        super(scope,id);

        // Add the alarm
        this.messagesInQueueAlarm = new cloudwatch.Alarm(this, 'Alarm', {
            alarmDescription: 'There are messages in the Dead Letter Queue',
            evaluationPeriods: 1,
            threshold: 1,
            metric: this.metricApproximateNumberOfMessagesVisible(),
            period: Duration.minutes(1), <= 追加
        });
    }
}

再度「Snapshot tests」の実践

テストを実行したところ Period 属性が 300 -> 60 になっていることを通知しています.

$ npm run build && npm test

> jest-handson@0.1.0 build /Users/tada/awscdk-handson/jest-handson
> tsc


> jest-handson@0.1.0 test /Users/tada/awscdk-handson/jest-handson
> jest

 FAIL  test/dead-letter-queue.test.ts
  ✕ dlq creates an alarm (69ms)

  ● dlq creates an alarm

    expect(received).toMatchSnapshot()

    Snapshot name: `dlq creates an alarm 1`

    - Snapshot
    + Received

    @@ -19,11 +19,11 @@
                },
              ],
              "EvaluationPeriods": 1,
              "MetricName": "ApproximateNumberOfMessagesVisible",
              "Namespace": "AWS/SQS",
    -         "Period": 300,
    +         "Period": 60,
              "Statistic": "Maximum",
              "Threshold": 1,
            },
            "Type": "AWS::CloudWatch::Alarm",
          },

       7 |     const stack = new Stack();
       8 |     new dlq.DeadLetterQueue(stack, 'DLQ');
    >  9 |     expect(SynthUtils.toCloudFormation(stack)).toMatchSnapshot();
         |                                                ^
      10 | });

      at Object.<anonymous> (test/dead-letter-queue.test.ts:9:48)1 snapshot failed.
Snapshot Summary
 › 1 snapshot failed from 1 test suite. Inspect your code changes or run `npm test -- -u` to update them.

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   1 failed, 1 total
Time:        3.074s
Ran all test suites.
npm ERR! Test failed.  See above for more details.

この変更が意図的であれば,npm test -- -uで「Snapshot tests」をコミットします.1 snapshot updated. とあるため,「Snapshot tests」が更新され,新しいアラームの期間がセットされます.

$ npm test -- -u           

> jest-handson@0.1.0 test /XXX/XXX/awscdk-handson/jest-handson
> jest "-u"

 PASS  test/dead-letter-queue.test.ts
  ✓ dlq creates an alarm (72ms)1 snapshot updated.
Snapshot Summary
 › 1 snapshot updated from 1 test suite.

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   1 updated, 1 total
Time:        3.059s
Ran all test suites.

テスト後の CloudFormation テンプレートコピーがどう変化しているかも確認します.こちらも Period 属性が 300 -> 60 に反映されているので意図した変更が反映されています.

// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`dlq creates an alarm 1`] = `
Object {
  "Resources": Object {
    "DLQ581697C4": Object {
      "Type": "AWS::SQS::Queue",
    },
    "DLQAlarm008FBE3A": Object {
      "Properties": Object {
        "AlarmDescription": "There are messages in the Dead Letter Queue",
        "ComparisonOperator": "GreaterThanOrEqualToThreshold",
        "Dimensions": Array [
          Object {
            "Name": "QueueName",
            "Value": Object {
              "Fn::GetAtt": Array [
                "DLQ581697C4",
                "QueueName",
              ],
            },
          },
        ],
        "EvaluationPeriods": 1,
        "MetricName": "ApproximateNumberOfMessagesVisible",
        "Namespace": "AWS/SQS",
        "Period": 60, <= 変更
        "Statistic": "Maximum",
        "Threshold": 1,
      },
      "Type": "AWS::CloudWatch::Alarm",
    },
  },
}
`;

まとめ

AWS CDK がサポートしている「Jest」の概要と「Snapshot tests」 の実践を行いました.他の2つのテスト手法も使い分けの説明ができるようにブログにしていきます.

関連記事

AWS CDK」の他の記事もぜひ!

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com