見出し画像

AWS Summit「Developer Zone杯争奪デベロッパークイズ王決定戦!」予選振返り

5月25日(水)~26日(木)に開催される今年度AWS Summit JAPANに「Developer Zone杯争奪デベロッパークイズ王決定戦!」があります。この予選会が昨夜あったので、気軽に参加してきました。幅広いトピックが取り上げられていて勉強になったので、問題、解説等をメモしておきたいと思います。

開催形態

予選はGoTo Webinarを使ったAWSのいつものウェブセミナーの形式で開催され、4択問題に参加者全員がアンケート機能で回答という方式でした。出題数は20問で、うち5問は高難度問題で配点5点、残り15問は配点1点で、計20問、40点満点。制限時間は1問60秒。進め方は5問出題ごとに、そこまでの回答と解説という形でした。

司会はAWS DevAxチームの金森さん。解答・解説におなじみ福井さんと、SAの落水さん(以下敬称略)。

問題1~5

問題1:選択肢の中から、2022年5月現在でAWS Lambdaのランライムがサポートしていない言語を選択してください(コンテナイメージやカスタムランタイムを除きます)。
1. Java
2. C#
3. Python
4. Clousure

金森「お、意外と割れた?」
福井「意外と割れてますね」

問題2:選択肢の中から、Amazon EC2の正式名称を選択してください。
1. Amazon Elastic Cloud Compute
2. Amazon Elastic Compute Cloud
3. Amazon Easy Compute Cloud
4. Amazon Elastic Computing Cloud

金森「問題作るときにS3と悩んだんですよね」
福井「それも考えられますね」
落水「たしかに、どちらも正式名称って普段あまり触れないですよね」
Simple Storage Serviceでしたっけ…?

問題3:下の疑似コードで期待される出力を選択肢から選択してください。
a. 5050
b. 2550
c. 2450
d. 0

a = 100;
result = 0;
 
for(i = 0; i < a; i++) {
  if (i % 2 == 0) { result + i }
}
 
print(result)

金森「回答の時はコード見えなくなっちゃうのはご容赦いただいて」
福井「ああ、それは難しいね。覚えておかないといけないものね」
落水「割れましたね。皆さん、かなり悩まれてますね」

問題4:AWS AppSyncはどのようなAPIを提供するためのマネージドサービスでしょう。
1. GraphQL
2. REST
3. CRUD
4. GraphDB

落水「どの選択肢もありそうなものなので、悩まれるかもしれないですね」
金森「ぜひ、この後でAppSyncを触っていただければ」

問題5:ポリモーフィズムについて正しく説明している文章を選択してください。
1. 同じ関数やメソッドの呼び出しに対してオブジェクト毎に異なる実装を利用できる性質
2. オブジェクトの内部の詳細を外部から隠ぺいすること
3. 異なる関数やメソッドの呼び出しに対して、同一の実装を利用できる性質
4. オブジェクト指向プログラミングにおいて、あるクラスが別のクラスの性質を受け継いでいること

福井「Developerでも最近はオブジェクト指向とは限らないですよね。ひょっとしたら、年配者の方がよく知ってるかもしれない」
金森「オブジェクト指向も学ぶのかなと思ってるんですけど、関数型から入ったりするんですかね」
福井「可能性はありますね」

問題1~5の回答と解説

問題1は「1. Clousuer」が正解。配点は1点。
金森「Java、C#、Pythonみたいな人気の言語はサポートしてますね」
福井「問題文にも付されてる通りコンテナとか使えば使えますが、AWSが提供するランタイムとしてはClousuerは現状ないですね」
金森「Clousuerが使いたいよという方は、ぜひお近くのAWSメンバーまでフィードバックを」

問題2は「2. Amazon Elastic Compute Cloud」が正解。配点は1点。
金森「これ4番と間違えた人も結構おいでじゃないでしょうか」
福井「えーって言ってる人もいそうですね」

問題3は「d. 0」が正解。配点は1点。
金森「1~100まで偶数を足してるように見せかけて、代入してないんですね」
落水「かなり意地悪な問題ですね」

問題4は「1. GraphQL」が正解。配点は1点。
金森「最近使われるお客様も増えてきてるんじゃないですかね」
福井「そうですね。ただときどきGraphDBと混同しがちではありますね」

問題5は「1. 同じ関数やメソッドの呼び出しに対してオブジェクト毎に異なる実装を利用できる性質」が正解。配点は1点。
福井「これは1番。多態性ですね」

問題6~10

問題6(高難易度 ×5点):Amazonリソースネーム(ARN)をあらわす正規表現を選択してください。
A. arn:aws(-cs|-us-gov)?:([[:alnum:]]+:([[alnum:]]|\)*:([0-9])({0,12}:.*$ b) 
B. arn:aws:iam:ap-northeast-1:([0-9]){0,12}:.*$
C. aws:arn:([[:alnum:]]|-)+:([[:alnum:]]|-)*:([0-9]){0,12}:.*$
D. arn:aws(-cs|-us-gov)?:([0-9]){0,12}:.*$

金森「正規表現って考えれば考えるほど混乱してきません?」
落水「普段頭の中でイメージすることとかないですからね」
福井「特徴的な『+』とか『?』とかを考えてもらうとわかるかな?」

問題7:次のうち、正しいHTTPステータスコードと、Reason-Phraseの組み合わせを選択してください。(RFC 7231に基づくものとします)
a. 401: Unauthorized
b. 503: Bad Gateway
c. 201: Create
d. 303: Found

金森「これは皆様、普段見慣れているものもあるかな。さすがに404とかはいれませんでした」
福井「割れてますね。結構難しいのかもしれないですね。400番台や500番台はわりと見ているかもしれませんが」

問題8:AWS SDK for Java 2のSmart Configuration Defaultsでサポートされていないデフォルトモードを選択してください。
1. mobile
2. auto
3. multi-region
4. in-region

金森「私この機能結構好きなんですけどね」
福井「デフォルトモードがあって、それなりによろしくやってくれますからね」

問題9(高難易度 ×5点):次のDockerfileを利用してビルドしたコンテナイメージに対して、以下のDocker CLIを実行した場合の出力結果を選択してください。
1. hello
2. uname
3. Linux
4. エラーが発生

Dockerfile

FROM amazonlinux:2
 
CMD ["hello"]
ENRYPOINT ["/bin/echo"]

Docker CLI

docker container run --entrypoint uname aws-summit-2022

福井「普段Docker触られてる人には難しくないかもしれないですが」
金森「どうかな。触っている人ほど…」
福井「これはいい問題ですね。性格が出て…」
金森「落水さんが考えてくれました。これは学びがあっていいもんだだと思いますが」

問題10:SAM CLI ver 1.48.0以降でsam initコマンド実行時にAWS X-rayトレースを有効にする方法を選択してください。
1. sam init --xray
2. sam init --tracing
3. sam init --tracing enable
4. sam init --xray on

金森「samは小さい関数とかサーバレスのアプリケーションとか書くときにはすごく楽ですよね。いまは他にもCDKとかいろんな選択肢がありますが。OSSのServerless Frameworkとかも」
福井「そうですね、人気ありますね」

問題6~10の回答と解説

問題6は「A. arn:aws(-cs|-us-gov)?:([[:alnum:]]+:([[alnum:]]|\)*:([0-9])({0,12}:.*$ b)」が正解。配点は1点。実際に検証するデモが行われました。検証用スクリプトがこうだったかな。写経(目で見て手入力で写してる)ので間違ってたらごめんなさい。

TEST_CASE_FILE="q6-test-cases.txt"
TEST_CASE_COUNT=$(wc -k < "$TEST_CASE_FILE")
REGEX_SAMPLES=(
  "arn:aws(-cs|-us-gov)?:([[:alnum:]]+:([[alnum:]]|\)*:([0-9])({0,12}:.*$ b)"
  "arn:aws:iam:ap-northeast-1:([0-9]){0,12}:.*$"
  "aws:arn:([[:alnum:]]|-)+:([[:alnum:]]|-)*:([0-9]){0,12}:.*$"
  "arn:aws(-cs|-us-gov)?:([0-9]){0,12}:.*$"
)
for i in {0..3}; do
  echo "${REGEX_SAMPLES[$i]}"
  echo Result: $(grep -E -c "${REGEX_SAMPLES[$i]}" "$TEST_CASE_FILE")/"$TEST_CASE_COUNT"
  echo "====="
done

テストケースファイル(q6-test-cases.txt)が多分こんな感じ。

arn:aws:iam::123456789012:user/evelopment/product_1234
arn:aws:s3:::examplebucket/developers/design_info.doc
arn:aws-cn:ecs:us-east-1:123456789012:cluster/my-cluster-1
arn:aws:workspaces-web:ap-northeast-1:1223456789012:aaa

福井「中国リージョンの記述をご存じかどうかはちょっとポイントですね」
金森「1番目は全部当たりますが他は0ですね。4番目が当たらないのは?」
落水「3つ目の『:』に囲まれたところはサービスの名前空間なのですが、そこを12桁の数字で、つまりアカウントIDをパースしようとしてるんですね。現状、サービス名が数字だけというものはないので、マッチしません」
金森「ちなみに正答率は50%くらいでした」

問題7は「a. 401: Unauthorized」が正解。配点は1点。
金森「201はCreated、dがつくんですよね」
福井「これ意地悪だなあ。引っかかった人いると思うな」

問題8は「3. cross-region」が正解。配点は1点。
金森「Javaのアプリって色々なところで動くんですよね。単一のリージョンだったり、複数のリージョンだったり、モバイルだったり」
福井「そこでリトライの条件とかを適切に設定してくれるんですよね」
金森「で、autoを選ぶと実行環境を推定して勝手に選んでくれるというところまで提供している機能になっています」

問題9は「3. Linux」が正解。配点は1点。
落水「docker CLIでentrypointを上書きするとDockerfileのCMDインストラクションは無視されるんですよ。なので、なにも指定しないとechoに対してhelloが渡るんですけど、unameで上書きしているのでunameの実行結果がそのまま出ると」
金森「皆さんももしよければこのCMDとENTRYPOINTの動きはいろいろと試していただくと」

問題10は「2. sam init --tracing」が正解。配点は1点。
福井「これは比較的新しい機能なので、ご存じない方もいらっしゃったかなと」
金森「他は全部エラーになりますね」

問題11~15

問題11:下記の図が表すOpenID Connectのフローの名前を選択してください。
1. Implicit Flow
2. Resource Owner Password Credentials Flow
3. Authorization Code Flow
4. Hybrid Flow

金森「そもそもOpenID Connectに複数のフローがあること自体あまり知らないかもですが、よく見ていただくと想像つくかも」
福井「そうですね。よく見ていただくと、ああ、と思われるかなと」
金森「OpenIDはRFCを読む練習にもいいんですよね。最初に読んだRFCがこれです」
福井「私はSMTPだったかな。時代がずいぶん違うなあ」

問題12:選択のうち、時間計算量が O(1) となるものを選択してください。
1. n個の自然数からなる配列のクイックソート
2. n文字の英語文章から "a" で始める単語の抽出
3. 1からnまでの自然数の和の計算
4. n件の宛先に荷物を届ける最短経路の計算

落水「時間計算量のオーダーの意識って、設計でもまあやるんですが、コードをバリバリ書く人に有利かもしれませんね。メソッドとか呼ぶときに、リファレンス見てこれはオーダーいくらだなとか意識すると思うので」
福井「たしかに。競技プログラミングとかしてる方はすごく意識しますよね」

問題13:AWS Summitが日本で最初に開催されたのは何年でしょうか?
a. 2006年
b. 2011年
c. 2012年
d. 2016年

金森「これSAとして参加したのはいつからですかね、福井さんが一番先?」
福井「僕はそんなに古くないんですよ。2015年かな?」
金森「福井さん、それ、ネタバレ」

問題14:選択肢のうち、AWS App Runnerの説明で誤っているものを選択してください。
1. GitHubのリポジトリを選ぶだけでPythonのアプリをデプロイできる
2. ECRに保存されたコンテナイメージを選び、Railsアプリをデプロイできる
3. アプリケーションをデプロイすると自動的にCDNが設定される
4. コンテナアプリケーションからVPC内部のAmazon Auroraに接続できる

福井「もうダメだってTweetしてる人がいますね」

問題15(高難易度 ×5点):選択肢のうち、Beyond the Twelve-Factor Appに含まれていないものを選んでください。
1. API first
2. Logs
3. Disposability
4. Config

落水「Twelve-Factor Appを読んでる人もBeyond Twelve-Factor Appは読んでないかもですね」
金森「Twitterがみなさん、分からないという嘆きであふれてますね」
福井「『もうダメだ』って多いな」

問題11~15の回答と解説

問題11は「3. Authorization Code Flow」が正解。
金森「OpenID Connectには1、3、4があって、2番はOAuthのものですね。このうち3と4で悩みそうですが、違いはIdP(IDプロバイダ)からAuthorization Codeを返しているところですね。Hybridの場合はモバイルクライアント等を意識しているので、この段階でID TokenとかAccess Token返しちゃうんですよね。Authorization Code Flowの場合RP(リソースプロバイダ)がID TokenとかAccess Tokenを受取るのでクライアント側にトークンが渡らないのがポイントです。この辺りクライアントに応じてフローを使い分けます」
福井「うーん、勉強になりますね」

問題12は「3. 1からnまでの自然数の和の計算」が正解。
落水「3番は公式があるので、nによらず固定の計算量で答えが出せるんですね」
金森「これもなかなかぱっと浮かばないので、いい問題ですね」

問題13は「c. 2012年」が正解。
金森「2016年はLambdaの発表年のつもりで問題に組み込んだのですが、それは2014年だったという」

問題14は「3. アプリケーションをデプロイすると自動的にCDNが設定される」が正解。
福井「VPCにアクセスできるようになったアップデートが最近の目玉ですね」
落水「いろんなユースケースに対応できるようになりましたね」

問題15は「4. Config」が正解。
福井「これもマニアック問題ですね」
金森「LogsとDisposabilityは重要だと思ってるので、入れさせていただきました」

問題16~20

問題16:Amazon DynamoDBで2018年に登場した、データを読み書きした量に応じてコストを計算するキャパシティーモードを選択してください。
1. Provisioned Capacity mode
2. Serverless Capacity mode
3. Pay-as-you-go Capacity mode
4. On-demand Capacity mode

福井「DynamoDB使ってる方はご存じではないかと」
金森「昔から使ってる人で容量読めてる人は、使ったことないかもですね」
福井「すごいヒント出しましたね」
金森「これが出てきたことで利用量の見積もりがしやすくなって、実際の動き見ながら変えていけるようになったのいいですよね」
福井「そうですね。…いやほぼ言ってるような感じが」

問題17(高難易度 ×5点):バージョン2.23のGitで追加された新しいコマンドを選択してください。
1. git show
2. git status
3. git stash
4. git switch

福井「これは結構難しい…昔から使ってる人ほど難しいかも」
金森「でも普段使ってないものを選ぶのも手じゃないですか?」
福井「ああ、なるほど…スーパーヒントをありがとうございます」
落水「普段GUIで使ってる方はなじみがないかもしれませんね」
金森「VScodeのGitプラグインがほんとよくできてまして。Gitのオプションを全部覚えた自信が常にないです」

問題18:選択肢から、Amplify Studioで連携できるデザインツールを選択してください。
1. Sigma
2. Figma
3. Lambda
4. Angular

金森「去年のre:Inventで結構注目されてた機能なので」
福井「デモもやってましたしね」
金森「あ、ヒント多すぎですと言われてしまった」

問題19(高難易度 ×5点):Amazon DynamoDBのGlobal Secondary Indexについて正しい記述を選択してください。
1. ベーステーブルへの更新は動機的に反映される
2. テーブル内に一行も存在しない項目については作成することができない
3. 既存のテーブルにIndexを作成する際には、作成する分だけベーステーブルのキャパシティユニットを挙げておく
4. 1~3に正しい記述はない

金森「トークにヒントありすぎなのでぎりぎりまで答えない…とか言ってる人いますけど、そのうち回答し損ねて時間切れとかしちゃいますよ?」

問題20:amplify import authコマンドで実現できることを選択してください。
1. 指定したCognitoUserpoolのデータをS3にバックアップする
2. 指定したCognitoUserpoolのデータをDynamoDBにバックアップする
3. 指定したCognitoUserpool、IDPoolのデータをAmplify管理下にできる
4. 指定したCognitoUserpoolのデータをAmplify管理下にできる

金森「レベル高すぎの予選会とも言っていただいてて、ちょっと安心しました。簡単すぎるよりはそっちの方が楽しいと思って頑張って考えました。
落水「カバー範囲広かったですね」
福井「RFCとかオブジェクト指向とかまでありましたからね」

問題16~20の回答と解説

問題16は「4. On-demand Capacity mode」が正解。
金森「見積りがしにくい時は使ってみてください」

問題17は「4. git switch」が正解。
金森「git checkoutをいろんな目的で使っちゃうのをやめて、ちゃんとコマンド分けようぜという取り組みですね。すみません、checkout使ってます」
福井「私も使ってます」
金森「せっかくなので皆様、gitのバージョン上げてgit switch使うようにしましょう」

問題18は「2. Figma」が正解。
福井「UIデザイナー とコードが連携できるのはとても素晴らしい機能なので、ぜひお使いいただければと思います」
金森「下のURLのブログを見ていただくと簡単に試せます」

問題19は「4. 1~3に正しい記述はない」が正解。
福井「これもひっかけですねえ」

問題20は「3. 指定したCognitoUserpool、IDPoolのデータをAmplify管理下にできる」が正解。
金森「IDPoolまで行けますよというのがポイントですね」
福井「まずCognitoにUserPoolとIDPoolがあるというのを知っていると、すこし回答しやすかったかもしれないですね」

AWS Summitのご紹介

予選が一通り済んだ後は、本戦も行われるAWS Summit JAPANの紹介でした。

Developer Zoneのセッションから以下が紹介されていました。内容は、セッションページでご確認ください。

終わりに

回答にも参加しましたが、難しかったな、開発やらないとなというのが感想でした。自己採点では20点、ちょうど半分ですね。個人感想戦もやりたかったのだけど、トーク部分がずいぶん勉強になったなと思ってメモを整理していったらそれだけでずいぶん長くなってしまったので、割愛。

AWS Summit JAPANはいよいよ今週の水曜日、木曜日。デベロッパークイズ王決勝戦観戦も含めて、楽しみですね。

(2022.05.24 更新)問題9のDockerfile内、 "CMD" の部分が "CMF" となっていたため、修正しました。ご指摘ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?