Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って始めたブログ

Cloud Runについて調べてみた話

AWSだけでなく、GCPについても知識を深めていこうと思い、最近流行りのCloud Runについて調べたことを書いていきます。

Cloud Runとは?

GCPが提供しているサーバレスプラットフォームは以下3つあるが、その内の1つ。

  • Cloud Functions
  • App Engine
  • Cloud Run <- コレ!

中でもCloud Run自分で作成したDockerコンテナをサーバーレス環境で実行できるという特徴を持つ。

GCPが提供しているサーバレスプラットフォームの選び方(使い分け)

GCPのドキュメントに書いてあったので、こちらを転機。
https://cloud.google.com/serverless-options/?hl=ja

Dockerコンテナを動かすという特徴から、好きな言語とライブラリを使って開発したい場合に選ばれることが多い。
それだけでなく、規模や開発容易性からも選ばれることが多そう。。。

料金

https://cloud.google.com/run/pricing?hl=ja

上記に書いていますが、イマイチピンときません。私はお金にうるs(ry
簡単に式にすると、以下になる模様。

  • (呼び出し回数 * Requestの時間) * スペック(CPU/メモリ)

以下の料金シミュレーションをしてみると、(デフォルトスペックなら)1 Request(10秒)を100万回実行しても0円なので、結構リーズナブルなんではないかと・・・ (多分、無料枠分で結構遊べるので、個人開発や個人サイトで運用する分なら、ほぼ無料だと思われる)

https://cloud.google.com/products/calculator?hl=ja

使い方

以下ご参照。
https://cloud.google.com/run/docs/quickstarts/build-and-deploy?hl=ja

試しに実施してみましたが、使用するのはCloud Runだけかと思いきや、他にも以下サービスも使いました。

  • Cloud Build ・・・ コンテナのビルドはココで行う。
  • Container Registry ・・・ コンテナのビルド後のイメージをココで管理する。(イメージファイルはCloud Storageに格納)
  • Cloud Storage ・・・ コンテナのビルド前、ビルド後のイメージファイルはココに格納される。
  • Cloud IAM ・・・ Cloud Runの実行権限等の管理はココ。

Cloud Runへのデプロイまでに、以下ステップを踏む模様。

  • Step.1: Cloud Storageにビルド前ファイルを配置
  • Step.2: Cloud Storageに配置したビルド前ファイルを使用して、Cloud Buildでビルド
  • Step.3: Cloud BuildでビルドしたイメージはContainer Registry管理。ビルド後のイメージファイルはCloud Storageに配置
  • Step.4: Container Registry(ビルドしたイメージ)からCloud Runで起動。権限周りはCloud IAMを使用

Cloud Runへデプロイは直接ではなく、Container Registryから行う流れですね。
このあたりはAWSも同じですね。

上記で記載した料金についても、上記4つサービスすべてに料金(従量課金)が掛かってくるので注意!
とはいえ、無料枠もあるので微々たるものだと思います。
1回しかデプロイしないのであればCloud StorageContainer Registryにあるビルド前ファイルとイメージファイルは削除して良いかもしれません。
(デプロイすればするほどCloud Storageに履歴ファイルが溜まっていくので、このあたりも定期的な削除が必要です)

認証・公開制限

Cloud Runでは、今のところCloud IAMを利用した認証・公開制限しかできません。
つまり、IP制限Basicを利用した制限コンテナ内で行うかCloud Endpoints等の他サービスを利用する必要があり、工夫が必要です。

CDN配信

Firebase Hostingと連携すれば、GCPサービス内で完結できます。

https://firebase.google.com/docs/hosting/cloud-run?hl=ja

まとめ

Cloud Runを使用するにあたり、Cloud Runだけでなく他サービスの理解も必要だと感じました。
とくにCloud IAMの理解は必須。Cloud Endpointsも使えるようになっておくと、さらに便利そうです。
というわけで、引き続き他サービスについても勉強していきたいと思います。(= =)>

『リファクタリング 既存のコードを安全に改善する(第2版)』の感想

著者:MartinFowlerさんの本『リファクタリング 既存のコードを安全に改善する(第2版)』を読んだので、その感想エントリーを書いていきたいと思います。

本書の第1版は「Java」で書かれていたのですが、第2版は「JavaScript」で書かれているので、フロントエンドの方でも読みやすくなっていると思います。
*とはいえ、「JavaScript」で説明できない部分(アクセス修飾子の表現等)は、「Java」で書かれているので注意してください。

本書のChapterと感想

本書のChapterは以下の通り、Chapterごとに感想を書いていきます。

Chap.1 リファクタリング-最初の例

サンプルコード(劇団員を派遣して演劇のパフォーマンスを行う会社を想定して、演じた劇に対する請求書を作成するコード)を例に、リファクタリングしていく一連の流れが書かれています。
このChapterを読むだけで、コードをリファクタリングしていく流れを体験できると思います。

私も本書を読むまで知らなかったのですが「いきなり目的に向かってリファクタリングをしても良いコード」と「いきなり目的に向かってリファクタリングをしてはいけないコード」があります。
たとえば、以下のようなサンプルコードがあり、関数名をinOldEngland(c)inNewEngland(c)に変更したいとします。

const newEnglanders = someCustomer.filter(c => inOldEngland(c));

function inOldEngland(aCustomer) {
  return ["MA", "CA", "ME", "VT", "NH", "RI"].includes(aCustomer.address.state);
}

関数名をただ変更するだけなので、直接関数名を変更したくなりますが・・・
ちょっと立ち止まって考えてみましょう!

関数名を変更すると、呼び出し側の関数名も変更する必要があります。
呼び出し側が1つしかないのであれば問題ありませんが、呼び出し側が複数ある場合、いきなり関数名を変更すると変更漏れが発生するかもしれません。
また、関数名が変わることで「引数の見直し」もしたくなるかもしれません。

このような場合、関数名変更後の関数を仮実装(inNewEngland(c)を仮実装)して移行することを考えます。

// Step.1
// 関数名を`inNewEngland(c)`に変更
const newEnglanders = someCustomer.filter(c => inNewEngland(c));

// 関数`inNewEngland`を仮実装する
function inNewEngland(aCustomer) {
  return inOldEngland(aCustomer);
}

function inOldEngland(aCustomer) {
  return ["MA", "CA", "ME", "VT", "NH", "RI"].includes(aCustomer.address.state);
}

引数も見直します。
こちらも段階的に変更します。

// Step.2
const newEnglanders = someCustomer.filter(c => inNewEngland(c));

function inNewEngland(aCustomer) {
  return inOldEngland(aCustomer.address.state);
}

// 引数を`stateCode`に変更。呼び出し側(仮実装側)の引数を変更します。
function inOldEngland(stateCode) {
  return ["MA", "CA", "ME", "VT", "NH", "RI"].includes(stateCode);
}
// Step.3
const newEnglanders = someCustomer.filter(c => inNewEngland(c.address.state));

// 引数を`stateCode`に変更。呼び出し側(実装側)の引数を変更します。
function inNewEngland(stateCode) {
  return inOldEngland(stateCode);
}

function inOldEngland(stateCode) {
  return ["MA", "CA", "ME", "VT", "NH", "RI"].includes(stateCode);
}

上記コードで、ちゃんとテストをして問題ないことを確認してから、仮実装した関数は削除して、以下コードに変更します。

// Step.4
const newEnglanders = someCustomer.filter(c => inNewEngland(c.address.state));

function inNewEngland(stateCode) {
  return ["MA", "CA", "ME", "VT", "NH", "RI"].includes(stateCode);
}

上記は遠回りなリファクタリングの方法です。
「テストをしていれば大丈夫!」と考える人もいると思いますが、「テストに責務を持たせすぎないこと!」というのも、本書では書かれています。
リファクタリングは小さな変更の積み重ねであること!」これが本書でMartinFowlerさんの言いたかった事の1つです。

Chap.2 リファクタリングの原則

リファクタリングの定義、リファクタリングを行う理由、リファクタリングはいつすべき?、問題点など・・・
リファクタリングの原則について書かれています。
やっぱり「IDEを使うのがいいよね」的な話も書かれていました。

Chap.3 コードの不吉な臭い

いわゆるリファクタリングすべき場所を解説している。
このあたりは「不吉な臭い」等でググると書いている記事が多くでてくる。
とはいえ、第1版と第2版ではいくつか追加・削除されたものもあるので注意。

devtab.jp

Chap.4 テストの構築

リファクタリングにはテストが欠かせない・・・というお話。
最近は、開発者にとってテストは関心事の1つになってきているとも書いてありましたね。テストやりましょう・・・・m( )m

Chap.5 カタログの紹介

ここから以下のChapterすべてリファクタリングテクニックのお話。 「うーん、書いてみないとわからんなぁ・・・」という箇所は、雑に写経しながら理解しました。

Chap.6 リファクタリングはじめの一歩

関数と変数に着目したリファクタリングのテクニック集。
- 関数は一画面に収まらなければ、ロジックを詰め込みすぎだと考える - 2回以上使われるコードはそれ自体を関数にすべき! - パラメーターが多すぎるならオブジェクトごと渡す!

などなど、いわゆるリファクタリングの王道パターンに対するテクニック集が記載されていました。

Chap.7 カプセル化

クラスに着目したリファクタリングのテクニック集。
私はあまり意識していなかったのですが、関数からコレクションを返す時は、コピーか読み取り専用にするのが良いとされていますね。
昨今では、このあたりもパフォーマンス的に問題になることは少ないとも書かれていました。
前のChapterでも書かれていましたが「変数・関数に名前を付ける -> 名前以上のことをする処理の場合はクラス化する」これを守っていればよさそうです。
委譲の隠蔽仲介人の除去は使い方が難しいテクニック(= o = ;;)

Chap.8 特性の移動

クラスや関数のロジックの移動に着目したテクニック集。
オブジェクト指向の大原則「データ構造処理を分離しよう」にしたがってリファクタリング(移動)しましょう!という感じですね。
ループの分離なんかで書かれている「1回のループで処理したいという理由だけで、2つの異なる処理を同時に行っているループをよくみる。」というコメントは、イタタタ・・・・

Chap.9 データの再編成

変数、フィールド名やそれ自体の置き換えや変更に着目したテクニック集。
フレッド・ブルックスの名言「フローチャートを見せてくれても、テーブルを隠されたら煙に巻かれたままだろう。テーブルを見せてくれれば通常フローチャートは要らない。それだけですぐわかる」 それだけ、名前って大切なんですね。ところで、フレッド・ブルックスって誰?(= = ;;)注)すごい人です
「変更可能なデータは、ソフトウェアにおける問題の発生源となる。」とのことですね。
話は変わりますが、TypeScriptreadonly修飾子がありますが、これが使えるだけで結構変わりそうです。

Chap.10 条件記述の単純化

条件分岐に着目したテクニック集。
ポリモーフィズムによる条件記述の置き換えは何を言っているのかさっぱりだったので、写経多め・・・
条件分岐にアサーションを入れてコメント代わりに使う方法があった。
Fowlerさんはセルフテストと呼んでいるそうですが、こんな使い方をするのもおもしろいですよね。

Chap.11 APIリファクタリング

関数、関数の引数などの呼び出し側に着目したテクニック集。
個人的にでるかな〜?と思っていた、setterの削除はここで登場。
「関数に渡す引数が、その関数に相応しいかを考えよう」をFowlerさんは責務という言葉を使って「債務が関数側に相応しいかを考えよう」と言っていました。
ファクトリ関数によるコンストラクターの置き換えで、コンストラクターの制限について書いていましたが、正直そんな事まで考えたこともありませんでした。m( )m

Chap.12 継承の取り扱い

最後は継承に着目したテクニック集。
委譲継承を同列で考えたことなんてありませんでした。m( )m
委譲によるサブクラスの置き換え委譲によるスーパークラスの置き換えはぜったい難しい。。。

さいごに

というわけで、雑な写経をしつつ、本を読み進めてみました。
大切なのはChap.3 コードの不吉な臭いを覚えること。そして、それに着目して怪しいコードはリファクタリングしていくこと。
リファクタリングはいつすべきなのか?」という問に対しても、Fowlerさんは「常に」と回答しています。
テクニックだけではなく、リファクタリングは身近なものでなくてはならないことを、この本で教わりました。
最初にも書きましたが、第2版は「JavaScript」で書かれているのですごく読みやすかったです。興味のある方は是非読んでみることをオススメします!!

OSSのライセンスについて調べてみた話

GitHubに落ちているライブラリ。
さくっと使えて便利なのですが、ふと「ライセンス」のことも気になったので、調べたことを以下に纏めておこうと思います。

「ライセンス」はなぜ大事なのか?

OSSは無償で公開されていて、誰でも自由に使用でき、「複製・配布・改良」することができるソフトウェアです。 しかし、この「複製・配布・改良」はライセンスによって制限されています。 このライセンスを守った上で、OSSを「複製・配布・改良」しないと、コンプライアンスの問題になるため、OSSを使用する時はライセンスも確認しておくのが良いです。

「ライセンス」の種類

OSSのライセンスは、「コピーレフト型ライセンス」と呼ばれる概念から始まり、大きく3つのカテゴリに分けられるそうです。

これら3つの違いは以下の通り。

類型 複製・配布・改良可能 改変部分のソース公開要 他のコードと組み合わせた場合、組み合わせたコードのソース公開要
コピーレフト型ライセンス
コピーレフト型ライセンス
コピーレフト型ライセンス

大きく違うのは「改変部分のソースを公開しなくてはならいのか?」と「他のコードと組み合わせた場合、組み合わせたコードも公開しなくてはならいのか?」です。
順番に見ていきましょう。

コピーレフト型ライセンス

代表的なライセンス ・・・ GNU General Public License(GPL)
代表的なソフトウェア ・・・ WordPressなど。。。

・コピーレフト型ライセンスを持つOSSを改変した場合、改変部分も同じライセンスの適用を要求する。
・コピーレフト型ライセンスを持つOSSを他の他のソフトウェアと組み合わせた場合、組み合わせ先のソフトウェアにまで同じライセンスの適用を要求する。

たとえばGPLの場合、GPLライセンスのコードを改変しても、他のソフトウェアと組み合わせたとしても、(他のソフトウェアも含めて)GPLライセンスになってしまう。ということです。
また、GPLには、同じコピーレフト型ライセンスですが、GPL2GPL3があり、その違いは以下の通りです。

  • GPL2 ・・・ OSS作成者の特許は守られる。たとえば、特許が含まれるコードを書いたとして、GPLに基づいてソースコードは公開しないといけません。しかし、特許は特許権を持っている人の裁量に任されているため、厳密な意味では自由に使えないコードになっている。
  • GPL3 ・・・ OSS作成者の特許は守られない。たとえば、特許が含まれるコードを書いたとして、GPLに基づいてソースコードを公開しないといけない&そのコードを利用した第三者を訴える権利を放棄しないといけない。

コピーレフト型ライセンス

代表的なライセンス ・・・ Mozilla Public License(MPL)
代表的なソフトウェア ・・・ Mozilla Firefoxなど。。。

・準コピーレフト型ライセンスを持つOSSを改変した場合、改変部分も同じライセンスの適用を要求する。
・準コピーレフト型ライセンスを持つOSSを他の他のソフトウェアと組み合わせた場合、組み合わせ先のソフトウェアにまで同じライセンスの適用を要求しない。

たとえばMPLの場合、MPLライセンスのコードを改変したものはMPLライセンスのままですが、他のソフトウェアと組み合わせた場合は他のライセンス(たとえば下のMIT License)を適用して良い。ということです。

コピーレフト型ライセンス

代表的なライセンス ・・・ BSD License、MIT License
代表的なソフトウェア ・・・ Vue.js jQueryなど。。。

・非コピーレフト型ライセンスを持つOSSを改変した場合、改変部分も同じライセンスの適用を要求しない。
・非コピーレフト型ライセンスを持つOSSを他の他のソフトウェアと組み合わせた場合、組み合わせ先のソフトウェアにまで同じライセンスの適用を要求しない。

たとえばMIT Licenseの場合、MIT Licenseライセンスのコードを改変しても、他のソフトウェアと組み合わせたとしても、他のライセンス(たとえば上のMPL)を適用して良い。ということです。
ただし、MIT Licenseは、特許や著作権などを明記する必要があるなど、製作者のコードが守られているため、非コピーレフト型からコピーレフト型へのライセンス切替はほとんど発生しません。

コピーレフトと特許や著作権は考え方が別

上記に出てきたGPL2GPL3のように、コピーレフトは、いわばライセンスの適用範囲を示したものなので、特許や著作権とは考え方は別です。特許や著作権の考え方はライセンスによって異なるので注意してください。

どのライセンスを選ぶべき?

使用したいOSSにライセンスは紐付いているので、選べないことが多いと思います。 似たようなOSSが複数あり、ライセンスが異なるのであれば、「非コピーレフト型ライセンス」であるBSD LicenseMIT Licenseを選ぶがの良いかと思います。 なお、2015年の時の情報ですが、GitHubにあるOSSでもっとも使用されているライセンスはMIT Licenseとの情報もあるので、MIT Licenseは選択肢に入りやすいと思います。

macOS(Catalina)で、デフォルトシェルがbashからzshに変更になったのもライセンスが原因!?

macを使用している方はご存知かと思いますが、macOS(Catalina)デフォルトシェルがbashからzshへ変更になりました。
この理由は、実はライセンスだと言われています。
というのも、Appleは、macOSGPL3ライセンスのソフトウェアを一切入れない!というポリシーを掲げています。(GPL2はOK)
そのため、macOSにインストールされているbashGPL2であるバージョン3.2からアップデートされていません。
現在(2020/07/06時点)の最新のbashのバージョンは5です。
bashはバージョン4から、GPL2からGPL3へライセンスの変更を行いました。 そのため、Appleはポリシーを守るため、macOSに標準で入っているbashのバージョンは3.2のままにしています。

## macOS(Catalina)でも入ってるbashのバージョンは3.2のまま・・・
$bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.

このままbashのアップデートを停止したままだと、セキュリティ上よろしくないため、ApplemacOS(Catalina)からデフォルトシェルをbashからzshに変更する決断をしたとのことです。
ちなみに、zshは、MIT Licenseです。

さいごに

個人的に興味を持って調べ始めた「ライセンス」のはなし・・・ 調べてみると、なかなかおもしろいもので、大変勉強になりました。

以下、勉強のため参考にさせていただいたサイトです。
ありがとうございました。

約3ヵ月の空白時間について

こんにちは。そして、お久しぶりです。
最後に書いた記事(3月)からだいぶ経ちましたね。
ちゃんと生きていますよー(= =)ノ

約3ヵ月ほど、ブログの更新が止まってしまいましたが、その間に何があったのか簡単に振り返りたいと思います。

まず、うちの会社でも3月中旬頃からリモートワークが始まりました。 その時は、まだブログを書く余裕はあったのですが・・・ちょうどリモートワークに慣れ始めた頃、「緊急事態宣言」により子供を保育園に預けることができなくなりました。そうなると、家と子供にすべての時間がとられてしまい、ブログを書く余裕なんてありませんでした。小さいお子さんをお持ちの方は、みんな同じような状況だったんじゃないかなぁと思います。「緊急事態宣言」が解除されて、やっと今になって少し余裕がでてきたので、ブログを書くことにしました。

では、この約3ヶ月ほどの間に何をしてたかざっくり書いていきます。
(細かい話は別途、記事にするかもしれません。)

  • AWS認定ソリューション - アソシエイトに再合格した
  • リモートワーク環境改善のため、Google Nest Wifiを購入した
  • リモートワーク&ワンオペの実績を解除した
  • デザインパターン入門を読み始めた
  • Laravelの案件に入れるかもしれないので、Laravel復習するぞ・・・

AWS認定ソリューション - アソシエイトに再合格した

3月最後のブログに「SAA取るんだー」と言ってましたが、無事取得しました。 事前にDAA取得のために勉強していたおかげもあって、1ヶ月くらいの勉強ですんなり取ることができました。
このあたりも本当は記事にしたかったのですが、今ではSAAの試験範囲や問題が大きく変わっています。そのため、今回私が実践した勉強方法は通用しないと思うので、お蔵入りですかねぇ。(= = ;;)

リモートワーク環境改善のため、Google Nest Wifiを購入した

ちょうどPixcel4を購入したときのクーポンが残っていて、何に使うか悩んでいたのですが、Google Nest Wifiに使うことにしました。
(本当はPixcel Budsが間に合っていれば、そちらを購入したかったんですが・・・コロナの影響で間に合わなかった模様?)

そのおかげで、家の通信環境が大きく改善しました。
「メッシュWifi」にはじめて挑戦してみたのですが、これが思ったよりも良かった。 うちは「メッシュWifi」を導入するほど家は広くないのですが、インターネット回線のコンセント配置上の関係で「メッシュWifi」の方が通信環境が改善されました。

今までは「Wifi中継機」を使って家の中をWifiで囲っていたのですが、どうしても「Wifi中継機」が親機のWifi内に配置する必要があり、以下図のように壁を挟むと電波が家の端まで届かなくて不便でした。

f:id:special-moucom:20200613135312p:plain:w300

対して「メッシュWifi」は親機のWifi内に配置する必要がなく、壁の内側に子機を配置することができます。
そのおかげで、Wifiを家の端まで届かせることに成功しました。

f:id:special-moucom:20200613135458p:plain:w300

ただ、Google Nest Wifiはお値段が高いので、次回も同じものを購入するかはわかりませんが、通信環境の改善と「メッシュWifi」の良さに気づけたのでとても満足しました。

リモートワーク&ワンオペの実績を解除した

家でリモートワークしながら、ワンオペで1歳半になる子供の相手をするという実績を解除しました。信じられないくらい大変なので、もう二度としたくありません。
お昼休憩(1時間)の間に、親と子供のお昼&子供の寝かし付けを行うという神業ができたのは、自分でもすごいと思いました・・・

デザインパターン入門を読み始めた

結城さんのこちらの本です。

まだ途中ですが、なんでもっと早くこれを読まなかったんだろう・・・と思わされました。
がんばって完走目指したいと思います。

Laravelの案件に入れるかもしれないので、Laravel復習するぞ・・・

コロナの影響がうちの会社にもあり、会社的にも個人的にも少し仕事の量が減っていました。
(とはいえ、家で子供の相手をする必要があったので、少し助かりましたが・・・)

だから・・・というわけではありませんが、会社のチャットグループを徘徊していると、どうやら他部署でLaravelの案件があって、バックエンドの人を募集しているとの情報が舞い込んできました。ちょうど「緊急事態宣言」の解除を受けて、保育園もそろそろ始まりそうな感じがしたので、すぐ上司に了承を得て、手を上げました。

そんなこんなで、Laravelの案件に入れそうなので、現在はLaravel復習中です。デザインパターンの本を読んでるおかげか、SingletonやFacadeなど、やりたいことの本質が見えてきた気がします。
Laravel案件楽しみだなぁ・・・(ノ* _ * )ノ

さいごに

さて、こんな感じで、ちょいちょいまたブログを再開していきたいと思います。
がんばってアウトプットしていきたいと思いますので、よろしくお願いします。m( )m

AWS認定ディベロッパー - アソシエイトに合格した話

2020年01月31日、AWS認定「ディベロッパー - アソシエイト」(以降、DAA)に無事に合格しました。

f:id:special-moucom:20200229013410p:plain

本記事では、DAA合格に向けてどんな勉強をしてきたのかを振り返りたいと思います。これからDAA取得を目指している方々にとっても、参考になれば幸いです。

  • 取得を目指した理由
  • 私のAWS事前知識
  • 学習方法
    1. 目標を設定する
    2. 情報を得る
    3. 「本」を読む
    4. Udemyをやる
  • 個人的に参考にさせて頂いたサイト
  • まとめ&反省点

取得を目指した理由

私は、3年前にAWS認定「ソリューション - アソシエイト」(以降、SAA)を取得しました。

kodak.hatenablog.com

AWS認定資格の有効期限は3年間です。
2017年09月にSAAの資格を取得したので、2020年09月には有効期限が切れて資格保有者ではなくなってしまいます。資格保有者でなくなるとどうなるか・・・ちょっと考えてみました。

  1. AWS Summit等のAWS主催のイベントで認定者ラウンジに入れなくなり、無料の休憩所やお菓子が貰えなくなる。
  2. 「私、AWS知ってます」とドヤれなくなる。

認定者ラウンジは、入れるとちょっとした特別感を感じることができるので、このまま資格保有者でなくなって入れなくなるのは嫌だなぁと思いました。また、AWSは常にサービスの成長を続けているので、3年前の「私、AWS知ってます」と、今の「私、AWS知ってます」では、知識の差が大きく、3年前の知識は役に立ちません。自身の知識をアップデートするためにも資格取得を目指そうと思いました。

こういった理由から「SAAの再取得しよう」と決めたものの、単純にSAAの再取得だけを目指すのは面白くない。というのも、最近は社内でもSAA保有者が増えてきたので、「SAA取得しましたー」だと、フーンで流されてしまう可能性もありました。「DAA取得しましたー」と言えれば、ちょっと反応は変わるかなと思い、今回はDAA->SAAの順番で再取得を目指すことにしました。

私のAWS事前知識

サーバーレス関連の技術を実務と趣味で触ってたりしています。具体的には、SAMをつかったサーバーレス関連サービスのデプロイ(Slack Botとか)やってたりします。
DAAはサーバーレス関連サービスの問題が多いので、そういう意味では個人的に少し恵まれていたかなと思いました。

学習方法

学習方法は、以下手順で行いました。

  1. 目標を設定する。
  2. 情報を得る。
  3. 「本」を読む。
  4. Udemyをやる。

1. 目標を設定する

DAAの取得を目指して勉強を始めたのは、2019年10月中旬くらいです。約4ヶ月を勉強に費やしました。子供の面倒を見ながらでの勉強なので、隙間時間を使っての勉強がメインでした。ちなみに、4ヶ月掛かったのは結果論で、本当は3ヶ月くらいで取得を目指したかったのですが、ちょっと無理でした。
受験する日付まで、具体的に決めてはおらず、だいたい3、4ヶ月後に取得したいなぁ・・・という感じで決めました。

2. 情報を集める

Qiitaや個人ブログから合格者の勉強方法などを参考にしました。特にDAA合格者の情報はSAA合格者に比べて情報が少ないので、貴重でした。

3. 「本」を読む

隙間時間を活用するため、通勤時間帯に読む用のDAA対策本がないか探して読むことにしました。恐らく2020/02/28時点でも以下の本しかないと思います。

AWSのサービスの1つ1つを軽く説明している感じで、初めて見るサービスの取っ掛かりには良いと思いました。この本を取っ掛かりにして、別途Black Beltやサービス活用事例集などを見て理解を深めました。

aws.amazon.com

4. Udemyをやる

DAA合格者の情報によると、「Udemyをやった。」との声が多く、私も初めてUdemyに登録・DAA対策コースの講座を購入することにしました。

最初に購入したのは、コレです。
お世辞ではなく、DAA取得を目指すならコレをやりましょう!! DAAの勉強方法、出題サービスのポイント、模擬試験付きのコースです。
ちなみに、Udemyはセールの時に購入するのがポイントだそうです。

Ultimate AWS Certified Developer Associate 2020 - NEW! | Udemy

英語ですが、ChromeGoogle拡張機能を入れて翻訳すると、字幕英語を日本語にしてくれます。不安な方は、コースをプレビューで表示してGoogle翻訳で日本語字幕で表示されるかを確認してから(セールの時に)購入しましょう。
私は英語がまったくできないので、Google翻訳頼みでした(笑

次に購入したのは、コレです。こちらはTwitterで、いわしまん(iwasiman)さんに教えていただきました。

日本人の方がDAA模擬試験問題集を出されていて、これもオススメです。

AWS 認定デベロッパー アソシエイト模擬試験問題集(5回分325問) | Udemy

模擬試験は全65問ありますが、できる方は一気にやりましょう。無理な方は、一気にやろうとせず、2・3日に分けてやりましょう。
私は無理な方でした。1日目に35問、2日目に30問+間違った箇所の復習(1日目に35問、2日目に30問、3日目に間違った箇所の復習)といった感じでチャレンジしました。
65問は無理でも35問くらいなら・・・と思わせてくれるので、問題の解くスピードも上がりますし、なにより勉強を継続できます。

私がDAAを取得した時、上記Udemyの模擬試験は80点くらいをキープしていたと思います。そういった意味では、模擬試験を80点くらい取れるようになれば、受験準備完了ですね。

個人的に参考にさせて頂いたサイト

最後に、DAA取得でお世話になったサイトを以下に記載します。皆様本当にありがとうございましたっ。

各サービスのベストプラクティスは知っておこう!

https://docs.aws.amazon.com/index.html

KMSのキー管理を理解するべし! めちゃわかり易い!

dev.classmethod.jp

KMSが理解できたら、S3の暗号化の種類がわかるっ!

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingEncryption.html

KMSが理解できたら、Parameter StoreとSecrets Manager何が違うの?って絶対思うはず・・・

qiita.com

Elastic Beanstalkの6つのデプロイ方法の理解。このBlack Beltの資料は超わかりやすい。

www.slideshare.net

DynamoDBのLSI/GSIの理解

dev.classmethod.jp

dev.classmethod.jp

まとめ&反省点

こうやって無事にDAAを取得することができました。しかし、課題もありました。 それは、勉強時間の設定・把握をしていなかったことです。
隙間時間を活用して勉強していると、自分が何時間勉強しているのか?勉強時間が十分に取れているのか?といった部分が、わからなくなります。そうなってくると、常に勉強時間が十分取れていないと思い、DAAの勉強以外手につかなくなります。つまり、マルチタスク(DAAの勉強以外のこと)ができなくなり、私の場合、結果的に4ヵ月間DAAの勉強しかやっていませんでした。
対応策として、いわしまん(iwasiman)さんが活用されているStudyplusを使って管理するのが便利そうだなぁと思いました。ただ、私自身がこういったツールを使い慣れていないので、なかなか使いこなすのは難しい感じがしています。

さて、長々と書きましたが、これからDAA取得を目指したい方の参考になれば幸いです。次はSAA合格話を書く!きっと書きます!