Azure Functionsのお勉強メモ(2)Spring Cloud FunctionでHTTP Triggerを実装する

最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。

どこまで続くかわからないお勉強メモ。今日は2回目です。今回はJavaです。前回はNode.jsで実装しました。

miyohide.hatenablog.com

JavaでのAzure Functions

Azure FunctionsでのアプリをJavaで実装してみます。Mavenではmvn archetype:generateでプロジェクトが生成できるので大変楽そうなのですが、あまりXMLファイルを書きたくなかったので、自分はGradleを使うようにしました。

docs.microsoft.com

過去にも似たようなことをやりましたが、Spring Cloud Functionのバージョンが上がっていたので改めてやり直し。

miyohide.hatenablog.com

ここでは上には記されていないことを中心に記述します。

Spring Cloud Function

将来的にRDBMSとの接続をすることを考えて、Spring Cloud Functionというフレームワークを使うことにしました。Spring Cloud Functionを使った記事はAzureのドキュメントにもあります。

docs.microsoft.com

上記にあるサンプルでもいいのですが、私はSpring Cloud Functionのサンプルを参考にしました。

docs.spring.io

これを書いている2021年3月21日ではSpring Cloud Functionは3.1.2で、前バージョンとはいくつか仕様変更が発生しています。

具体的には、3.1.1ではAzureSpringBootRequestHandlerを継承する必要がありましたが、3.1.2ではFunctionInvokerを継承する必要があるようです(正確には、AzureSpringBootRequestHandlerは非推奨化)。詳細はそれぞれのドキュメントを見ると良いかと思います。

3.1.1のもの https://docs.spring.io/spring-cloud-function/docs/3.1.1/reference/html/index.html

3.1.2のもの https://docs.spring.io/spring-cloud-function/docs/3.1.2/reference/html/index.html

build.gradle

build.gradleにてAzure Functionsにデプロイする情報を記述します。記述する内容の詳細については以下のwikiをみると良いでしょう。

github.com

今回はJava 11環境で動かしたかったのですが、runtimeに何も指定しないとJava 8の環境になるようです。以下のようにruntimejavaVersionを設定するとJava 11で生成されました。

azurefunctions {
    resourceGroup = 'sample_resource_group'
    appName = "sample_app_name"
    pricingTier = "Consumption"
    region = "japaneast"
    runtime {
        os = "windows"
        javaVersion = 11
    }
}

f:id:miyohide:20210322210705p:plain

これでAzureにデプロイすると動くはずだったのですが、以下のログが出力され500エラーが発生しました。

2021-03-21T06:59:56.612 [Error] Executed 'Functions.hello' (Failed, Id=exxxxxxxxxx, Duration=638ms)Result: FailureException: IllegalArgumentException: Failed to locate main classStack: java.lang.IllegalStateException: Failed to discover main class. An attempt was made to discover main class as 'MAIN_CLASS' environment variable, system property as well as entry in META-INF/MANIFEST.MF (in that order).at org.springframework.cloud.function.utils.FunctionClassUtils.getStartClass(FunctionClassUtils.java:83)

この問題を解決するにはbuild.gradleに以下の設定を追加します。この設定はマニフェストファイルにメインクラスのクラス名を指定して、実行可能なjarファイルとして生成することを意味しています。

jar {
    manifest {
        attributes 'Main-Class' : 'com.github.miyohide.Funcapp'
    }
}

FunctionとかSupplierとかConsumerとか

Spring Cloud Functionを使おうとするとちょっと面食らうのがFunction。 これは、Java 8から導入されたJava関数型インターフェースというもの。

www.ne.jp

ちょっと書き方が慣れないけれども、徐々に慣れていくしかないかなと。

テスト

テストを書くこともやってみました。build.gradleでのライブラリ指定をとりあえず以下のようにしました。

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-function-adapter-azure:3.1.2'
    testImplementation 'org.springframework.cloud:spring-cloud-starter-function-web:3.1.2'
    testImplementation 'org.springframework.boot:spring-boot-starter-test:2.4.3'
}

spring-boot-starter-testのバージョンを指定するのがちょっといまいちなのでなんとかしたいところ...

JUnit 5ではbuild.gradleにて以下の記述がないとうまくテストが認識されません。

test {
    useJUnitPlatform()
}

参考

junit.org

テストの書き方ついては以下を参照。

www.ne.jp

デプロイ

gradlew azureFunctionsDeployを実行するとAzure上にデプロイされます。早速、Application Insightsでrequestsテーブルを参照し、処理時間がどれぐらいかかるかをみてみました。

f:id:miyohide:20210322211044p:plain

デプロイ後、最初のアクセスには概ね6秒ぐらい処理時間がかかるようでした。高々数回しか試していないですし、フレームワーク使用の有無といった差もあるので、前回のNode.jsとの比較(4.6秒)はあまり意味がないかなと思います。倍ぐらいの差がつくのならともかく、高々数秒でしたら好きな言語やフレームワークを使えばいいかなと思います。

ソース

本ブログ記述時点でのソースです。

github.com

Azure Functionsのお勉強メモ(1)TypeScriptでチュートリアルを実施する

最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。

最初の関数を作成する

以下のチュートリアルをやることにする。

以下の環境で実行。とりあえずお手軽そうなTypeScriptで。

  • nodejs v14.15.5
  • func 3.0.3388

ローカル環境で動作させる

npm startでローカル環境でアプリが動きます。今回はHTTPトリガーで作っているので、ブラウザでアクセスすると動作が確認できます。

ファイルを修正したら、自動的にリロードされます。

全体概要や引数などのオブジェクトについて

以下のドキュメントに纏まっています。

function.jsonについて

function.jsonはトリガーや出力の定義をする感じ。詳細は以下に書かれています。

Azureにデプロイする

ログイン

az loginコマンドを実行します。ブラウザが開いてログインが求められるので、ログインしたらOK。

リソースグループを作成

az group createでリソースグループを作成します。

az group create --name リソースグループ名 --location 場所

場所はaz account list-locationsコマンドで得られるNameの値を指定する...と思っていたんだけれども、なんか使えないものもリストアップされる。

az account list-locations -o table
DisplayName               Name                 RegionalDisplayName
------------------------  -------------------  -------------------------------------
East US                   eastus               (US) East US
East US 2                 eastus2              (US) East US 2
South Central US          southcentralus       (US) South Central US
West US 2                 westus2              (US) West US 2
Australia East            australiaeast        (Asia Pacific) Australia East
Southeast Asia            southeastasia        (Asia Pacific) Southeast Asia
North Europe              northeurope          (Europe) North Europe
UK South                  uksouth              (Europe) UK South
West Europe               westeurope           (Europe) West Europe
Central US                centralus            (US) Central US
North Central US          northcentralus       (US) North Central US
West US                   westus               (US) West US
South Africa North        southafricanorth     (Africa) South Africa North
Central India             centralindia         (Asia Pacific) Central India
East Asia                 eastasia             (Asia Pacific) East Asia
Japan East                japaneast            (Asia Pacific) Japan East
Korea Central             koreacentral         (Asia Pacific) Korea Central
Canada Central            canadacentral        (Canada) Canada Central
France Central            francecentral        (Europe) France Central
Germany West Central      germanywestcentral   (Europe) Germany West Central
Norway East               norwayeast           (Europe) Norway East
Switzerland North         switzerlandnorth     (Europe) Switzerland North
UAE North                 uaenorth             (Middle East) UAE North
Brazil South              brazilsouth          (South America) Brazil South
Central US (Stage)        centralusstage       (US) Central US (Stage)
East US (Stage)           eastusstage          (US) East US (Stage)
East US 2 (Stage)         eastus2stage         (US) East US 2 (Stage)
North Central US (Stage)  northcentralusstage  (US) North Central US (Stage)
South Central US (Stage)  southcentralusstage  (US) South Central US (Stage)
West US (Stage)           westusstage          (US) West US (Stage)
West US 2 (Stage)         westus2stage         (US) West US 2 (Stage)
Asia                      asia                 Asia
Asia Pacific              asiapacific          Asia Pacific
Australia                 australia            Australia
Brazil                    brazil               Brazil
Canada                    canada               Canada
Europe                    europe               Europe
Global                    global               Global
India                     india                India
Japan                     japan                Japan
United Kingdom            uk                   United Kingdom
United States             unitedstates         United States
East Asia (Stage)         eastasiastage        (Asia Pacific) East Asia (Stage)
Southeast Asia (Stage)    southeastasiastage   (Asia Pacific) Southeast Asia (Stage)
Central US EUAP           centraluseuap        (US) Central US EUAP
East US 2 EUAP            eastus2euap          (US) East US 2 EUAP
West Central US           westcentralus        (US) West Central US
West US 3                 westus3              (US) West US 3
South Africa West         southafricawest      (Africa) South Africa West
Australia Central         australiacentral     (Asia Pacific) Australia Central
Australia Central 2       australiacentral2    (Asia Pacific) Australia Central 2
Australia Southeast       australiasoutheast   (Asia Pacific) Australia Southeast
Japan West                japanwest            (Asia Pacific) Japan West
Korea South               koreasouth           (Asia Pacific) Korea South
South India               southindia           (Asia Pacific) South India
West India                westindia            (Asia Pacific) West India
Canada East               canadaeast           (Canada) Canada East
France South              francesouth          (Europe) France South
Germany North             germanynorth         (Europe) Germany North
Norway West               norwaywest           (Europe) Norway West
Switzerland West          switzerlandwest      (Europe) Switzerland West
UK West                   ukwest               (Europe) UK West
UAE Central               uaecentral           (Middle East) UAE Central
Brazil Southeast          brazilsoutheast      (South America) Brazil Southeast

例えばjapanってものを指定すると、not availableって出てしまう。

$ az group create --name miyohide1 --location japan
The provided location 'japan' is not available for resource group. List of available regions is 'centralus,eastasia,southeastasia,eastus,eastus2,westus,westus2,northcentralus,southcentralus,westcentralus,northeurope,westeurope,japaneast,japanwest,brazilsouth,australiasoutheast,australiaeast,westindia,southindia,centralindia,canadacentral,canadaeast,uksouth,ukwest,koreacentral,koreasouth,francecentral,southafricanorth,uaenorth,australiacentral,switzerlandnorth,germanywestcentral,norwayeast,australiacentral2'.

日本リージョンではjapaneastとかjapanwestとかを指定すれば良いかなと思います。

ストレージアカウントの作成

Azure Functionsの実行プログラムを格納する場所を作成します。

az storage account create --name ストレージアカウント名 --location 場所 --resource-group リソースグループ名

Azure Functionsを作成する

az functionapp createコマンドを使ってAzure Functionsアプリを作成します。細かいオプションはリンク先を参照。

az functionapp create --resource-group リソースグループ名 --consumption-plan-location japaneast --runtime node --runtime-version 14 --functions-version 3 --name AzureFunctionsアプリ名 --storage-account ストレージアカウント名

上記のコマンドで、以下の環境が構築されます。

  • 実行環境はNode.js 14.x系
  • OSはWindows
  • 従量課金プラン
  • 作成と同時にApplication Insightsが作成

ビルド

本番環境用に手元にあるソースをビルドします。

npm run build:production

アプリをAzureに送信する

Azure Functions Core Toolsのコマンドであるfunc azuzre functionapp publishを実行して、ローカルにあるコードをAzureに送信します。

func azure functionapp publish AzureFunctionsアプリ名

こんな結果が表示されます。

Getting site publishing info...
Creating archive for current directory...
Uploading 10.8 KB [###########################################################]
Upload completed successfully.
Deployment completed successfully.
Syncing triggers...
Functions in miyohidefuncapp1:
    HttpExample - [httpTrigger]
        Invoke url: アクセス先URL

Invoke url?code=からはじまる長い文字列がついているのは、関数のアクセスキーという機能がついているため。ローカルではこの値にかかわらずアクセスできるが、Azureに送信したアプリを動かすにはこのcodeの値が一致していないと動かない(401エラーが出る)。

ログを見る

Azure Functionsを作成したらそれに紐づいてApplication Insightsも作られているので、いちいち無効化してなければログをみることができます。

クエリのところで何を入れれば良いかがよく分からなかったんだけれども、tracesにアプリでcontext.logの内容が見れました。

f:id:miyohide:20210317060904p:plain

出力される項目がたくさんあるので、見たい項目を絞りたい場合はprojectで見たい項目だけを指定すれば良いようです。

docs.microsoft.com

具体的には以下のような記述をしました。

traces
| project timestamp, message, operation_id

ここでは日時とメッセージのほかoperation_idというのを指定。これが同じものは同じリクエストでの処理っぽい。

f:id:miyohide:20210317061050p:plain

requestsdurationでその関数の実行時間が分かるみたい。

f:id:miyohide:20210317061115p:plain

今回はNode.jsで動かしたんだけれども、20分ぐらい処理がないと、次の処理に時間がかかる感じ。今回の例では、250ms以内で納まっていたものが、一気に4.6秒に跳ね上がった。おそらくこの内容に該当している。

Understanding serverless cold start

今回はNode.jsだったんだけれども、Javaならどれぐらいかかるのか、Linuxならどうなのかを実験したい。

テストを書く

Azure Functionsにおけるテストの書き方については、Azure Functions のコードをテストするための戦略に記述があります。

上記のドキュメントはJavaScriptの例でTypeScriptはまた違う気がしたので、他の資料を探しました。結果、TypeScript Deep Dive日本語版のJestの記事を参考にしました。

細かい話ですが、loglog.infoの両方をモック化したい場合にどういうふうにテストを実装すれば良いか分からなかったのですが、StackoverflowにそのまんまのQAがありました。

stackoverflow.com

ソース

試したソースは以下に格納しました。

github.com

RailsアプリにAzure Active Directoryを使って認証機能をつける

はじめに

先日、Java(Spring Boot)でAzure Active Directoryを使って認証機能をつける記事を書きました。

miyohide.hatenablog.com

Railsアプリに認証機能を追加する際、devisesorceryなどのgemを使うのがよく使われますが、最近ではIDaaSというサービスがたくさん出ています。これらを使うことでユーザー管理に伴う様々な問題から解放されるということなので、Azure Active Directoryを使ってRailsアプリに認証機能を実装してみることにしました。

最初に試したこと

sorceryWiki Pageをみていたら、External Microsoft Graph authenticationという記事を見つけたのでこれをやってみることにしました。

ただ、Wiki中に

Finally under Redirect URI add a URI for your app. This is the address Azure will respond to with Authentication info.

と記載があるのですが、私がAzure Portal上で試すと「クエリ文字列を含める事はできない」というエラーメッセージが出て登録できませんでした。

結局、動かすことができずに終了しました。

マイクロソフトチュートリアルをやってみる

何かいい手はないものかと思っていたところに、たまたまマイクロソフトがチュートリアルを公開していることを発見。これに沿って実装してみることにしました。

いくつか変更

結果的にはこのチュートリアルはうまく動きましたが、いくつか変更が必要な点がありました。また、最近のRailsアプリではよりよい実装方法があるのでそこも対処してみました。

oauth_environment_variables.rbの作成

「Add Azure AD authentication」の部分にてoauth_environment_variables.rbを作成していろいろな値を環境変数経由で格納するところがあるのですが、これはRailsが持っているcredentialの管理方法に従った方が良いかなと思いました。

実際のやり方は「パーフェクトRuby on Rails【増補改訂版】」に載っているので参照すると良いでしょう。

なお、この変更で値の参照方法もENV['AZURE_APP_ID']のように環境変数を参照する形からRails.application.credentials.azure_app_idのように変更する必要があります。

scopeの範囲

チュートリアルではENV['AZURE_SCOPES']openid profile email offline_access user.read mailboxsettings.read calendars.readwriteを指定していましたが、私が試した時はうまく動きませんでした。おそらく試したユーザーの設定方法に依存するかと思います。私の場合、emailmailboxsettings.readcalendars.readwriteの内容を消すと動かすことができました。

合わせてmicrosoft_graph_auth.rbraw_infoメソッドにおいて/meエンドポイントへのクエリ文字列からもmailmailboxSettingsを削除しましたが、これがどう影響したかは調べきれていないです。

OmniAuth::AuthenticityError Forbidden Erros が発生する

一番ハマったのがOmniAuth::AuthenticityError Forbidden Errosが発生する問題です。色々と検索したところ、以下のstackoverflowの記事が該当しました。

Build Ruby on Rails apps with Microsoft Graph Tutorial OmniAuth::AuthenticityError Forbidden Erros

omniauth gemのバージョンを1系に固定化することで対応可能ということなので、Gemfilegem 'omniauth', '~> 1'を1行追加してbundle updateを実行しました。

これで、「Add Azure AD authentication」の最後まで動作しました。

localhost:3000にアクセスするとこんな画面ですが...

f:id:miyohide:20210310205359p:plain

右上のSign inをクリックすると以下のような画面が表示され...

f:id:miyohide:20210310205445p:plain

必要な情報を入れると以下の画面になります。

f:id:miyohide:20210310205544p:plain

ユーザーの取得を行う

チュートリアルではカレンダーデータの取得を行なっていましたが、自分はMicrosoft Graph APIのユーザーの取得を発行してみることにしました。

チュートリアルでは、app/helpers/graph_helper.rbを作成していますが、ヘルパーはViewのために書くものなので、ちょっと違和感があります。私は、lib以下に作成し、make_api_callメソッドの定義を以下のようにしました(self.を追加した)。

def self.make_api_call(method, endpoint, token, headers = nil, params = nil, payload = nil)

このメソッドをcontrollerで

::GraphHelper.make_api_call("GET", "/v1.0/me", access_token)

という形で呼び出してあげると、Graph APIの呼び出しが成功します。

画面整形して表示させたのが以下のものです。

f:id:miyohide:20210310205337p:plain

実装ソースコード

以下で公開しています。

github.com

Spring BootにAzure Active Directoryで認証機能をつける

はじめに

Azure Active Directoryを使った認証機能をSpring Bootを使ったWebアプリに対して実施してみることにしました。

前提事項

本エントリー執筆時、Spring Bootの最新版安定版は2.4.2なのですが、今回使うazure-spring-boot-starter-active-directoryがSpring Boot 2.4.2に対応してないようでSpring Initializrで選択しようとしてもできませんでした。

f:id:miyohide:20210214114704p:plain

そのためこのエントリーではSpring Bootのバージョンを2.3.8にしました。

実装

Azure SDK for Javaリポジトリにサンプルコードが公開されています。

github.com

ほとんどここに書かれているものをトレースするだけです。

本エントリー執筆時、README.mdにはRedirect URLsの設定をhttp://localhost:8080/login/oauth2/code/にする旨が書かれていますが、この記述では以下の画像のような画面が出てログイン処理に失敗します。

f:id:miyohide:20210214133902j:plain

私の場合はhttp://localhost:8080/login/oauth2/code/azureにすることで動きました。

f:id:miyohide:20210214133937p:plain

ログイン処理が成功すると、ユーザー名のフルネームが表示されます。

この時点でのソースはこちら。

github.com

チーム・ジャーニーを読んだ

市谷聡啓さんの「チーム・ジャーニー」を読み終わりました。

カイゼン・ジャーニー」の続編という位置づけではありますが、時おり「詳細はこちらを読んで」と紹介されるぐらいで単独でも読み進められる一冊でした。

主人公が所属している会社にて実施しているプロダクト開発の進め方を題材にチーム開発であるあるな事例と解決を「ストーリー」として紹介し、より汎化した内容を「解説」として紹介するという組み合わせで構成されています。全部で16個のストーリーで構成されており、チーム開発している人たちであれば必ずどこかで該当する問題に出会うかなと思います。

個人的には

  • 第02話の「ワークショップ症候群」
  • 第03話の「一度に、すべての問題に取り組んでも、問題は減っていかない」
  • 第05話の「問題がないことは問題ではない?」
  • 第06話の「俺たちはなぜここにいるのか?スクラムをやるためか、それともプロダクトを世の中に届けるためか?」

の言葉やストーリーが非常に刺さりました。

また、第06話の内容全体は昨今のリモートワーク中心の仕事において、色々と考える参考資料となりました。

「ストーリー」で記されている解決方法は時おり都合の良いストーリーになっている感じがしないでもないですが、それをそのまま各々の現場で適用できるとは考えては駄目で、「解説」にて記されている内容を各々の現場で咀嚼して適用していく必要があるかなと思います。当たり前のことですが。 「ストーリー」がサクサク読めてしまいますので、「解説」もサクッと読み飛ばしてしまいそうですが、繰り返し自分の立場に置き換えて読む必要があると感じました。

AZ-204: Developing Solutions for Microsoft Azureに合格した

はじめに

2021年1月12日にAzureの資格試験の一つである「AZ-204: Developing Solutions for Microsoft Azure」を受験し、合格しました。

f:id:miyohide:20210116151444p:plain

ここでは合格に至るまでの勉強法などについて記します。

Microsoft Learn

まずはMicrosoft Learnで試験対象となる各種サービスを学ぶところからスタートしました。対象のラーニングパスはAZ-204の試験案内ページにリンクが貼ってあるのでそれを一通り実施。

docs.microsoft.com

無料でAzureのサービスを使えるのでお手軽なのですが、各種コマンドがコピー&ペーストで操作できてしまうので、ラーニングパスが終わってもあまり身についていないように覚えました。そこで、各種コマンドはあえてコピー&ペーストをせずに手打ちで実行するようにしました。

試験対策

試験対策としてはUdemyの講座とmeasureupの講座をやりました。

Udemy

UdemyのAZ-204の講座は検索するとたくさん出てきます。日本語のものはなさそうだったので、レビューが高かった以下の講座を購入しました。

www.udemy.com

Udemyはしょっちゅうセールをやっているので試験が直前ではない場合は、ちょっとまって購入した方が良いかと思います。ビデオは字幕あり+1.25倍速にして視聴し、わからないところは逐次検索して日本語の資料を読みあさりました。

テストも実施しましたが、解答解説が非常に簡素で、なぜこの回答が正しくなぜこの回答が誤りなのかを理解するのができないことが多かったので、measureupのPractice Testで補完するようにしました。

measureup

Udemyの講座だけでは不安感を覚えたので試験の一週間ぐらい前にOfficial Practice TestであるmeasureupのAZ-204試験対策を購入しました。

www.measureup.com

さすがのOfficial Practice Testなだけあって解答解説はかなり丁寧に書かれていました。間違えたところを中心に日本語資料や各種コマンド、サンプルコードを読んで試験に備えました。

試験

試験は自宅で受けられるオンライン試験と試験会場に出向く方式の二通りありますが、私は試験会場に出向くことにしました。オンライン試験はPCやmacにソフトをインストールする必要があり、また要件を満たすような環境を作るのは面倒くさいなと思ったためです。

docs.microsoft.com

試験会場は全国各地にあるのですが、昨今のコロナ禍の関係上、座席数が少なかったりして希望する日時が埋まっていることもあるようです。私は約1ヶ月前に試験予約をして座席を確保しておきました。

試験はいろいろな形式があるので事前にどのような形式があるか知っておくと良いかと思います。measureupでもある程度慣れることができますが、全てではないので以下のサイトに目を通すと良いかと思います。

docs.microsoft.com

結果

試験は難しく、最後の「完了」ボタンを押すときには「こりゃ落ちたかな?」って思ったのですが、700点以上合格のところ809点を獲得して合格できました。また試験勉強をしなくて済むとしってかなりほっとしました。

AWS 認定 ソリューションアーキテクト – アソシエイトに合格した

概要

少し前ですが、12月14日(月)にAWS 認定 ソリューションアーキテクト – アソシエイトを受験して合格しました。

業務上、クラウドの幅広い知識が求められるようになったので一念発起して勉強して受験することにしました。自分は、Azureを主に扱っていたのでAWSについては実務経験が乏しく、試験対策には結構苦労しました。ここでは試験に使ったものを主に記します。

学習

まずはUdemyの「これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)」を使って全体概要を学んでいきました。

www.udemy.com

この講座を一通り見て勉強しました。AWSのさまざまなサービスを一通り動画で学べるのは非常に分かり易かったです。動画は1.25倍速や1.5倍速でみて時間短縮をはかりました。

試験対策

つぎに同じくUdemyの「【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)」にて問題をたくさん解きました。

www.udemy.com

問題の形式に慣れたり、自分が不得意なところを把握しておくと言うのが目的です。前出の「これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)」にも問題がついていますが、勉強する時間もあったので数をこなす目的で模擬試験問題集も実施することにしました。

ちなみにですが、Udemyはかなり頻繁にセールをしています。セールが行われるタイミングはわからないのですが、試験日程に余裕がある人はちょっと待ってセールのタミングで買うと良いかとおもます。私は両講座合わせて2,400円で購入しました。

試験の3日前に、会社の同僚から以下の問題集がいいよと教えてもらいました。

aws.koiwaclub.com

ただ、すでに上記のUdemyの問題集でお腹いっぱいだったので自分は使うのはやめました。

本番

試験本番は遅刻しないように早めに会場の最寄り駅まで行き、近くのコーヒーショップでUdemyの問題を見直したり、自作のメモに目を通したりしていました。

f:id:miyohide:20201231134823j:plain

本番の試験問題は結構難しいと感じました。「こりゃ落ちたかな?」と不安になりましたが、気を取り直して冷静に問題を解き続けることにしました。後半になるにつれて問題が優しいと感じるようになり、一度問題を解き終わったあと再度全問見直して「多分これなら大丈夫かな?」と思ってテストを終了しました。

テスト終了後、アンケートに数問答えたあと合否結果が画面に表示されました。「合格」という文字を見て一安心。試験会場を退室しました。

退場するとすぐに詳細な点数などがもらえるのかなと思っていたのですが、FAQにあるように最大で5営業日かかるようです。自分は試験を受けた翌日にメールが来ていて詳細を見ることができました。775点と合格点(720点)と比べて微妙な点数。もうちょっと勉強しなければいけないなと思った次第です。

aws.amazon.com

最後に

10月に受けたAzure Administrator試験と合わせてAWS認定ソリューションアーキテクト - アソシエイト -にも合格し、ようやくクラウドの基本的な知識を身につけることができたかなと思っています。時折AWSとAzureでごちゃ混ぜになるのですが、適宜公式ページを見て知識の整理をしていくとよいのかなと思っています。

また、この試験は有効期限があるので期限が切れる前にはまた受けることになるのかなと思います。