MENU

模擬試験で撃沈した、LambdaのIAM権限とDynamoDBのキー設計

司会者、調理担当、配膳担当。AWSのCI/CDを例えで理解を説明する画像

おはようございます、YASUです。

DVAの学習を進めるにあたり、模擬試験を1回解いてみたところ、正直かなり苦戦しました。特に手応えがなかったのが、前回予告していた通り「LambdaのIAM権限設計」と「DynamoDBのキー設計」でした。今日はこの2つを重点的に整理し直します。

目次

結論

Lambdaには「実行ロール権限」と「呼び出し権限」という、似ているようで役割が全く違う2種類のIAM許可があります。またDynamoDBでは、QueryとScanという2つの取得方法の違いを理解していないと、実務でもパフォーマンスに大きな差が出ることが、実際の検証データからも裏付けられていました。

Lambdaの2種類のIAM許可、混同しやすいポイント

調べてみて一番はっとしたのが、「実行ロール権限」と「呼び出し権限」がまったく別物だという点でした。

  • 実行ロール権限:Lambda関数が「他のAWSサービスにアクセスする」ための権限。例えばLambdaがDynamoDBを更新したい場合、実行ロールにDynamoDBへの書き込み権限が必要
  • 呼び出し権限:他のAWSサービスやリソースが「そのLambda関数を呼び出す」ための権限。この許可がないと、そもそも関数自体が起動できない

ある技術ブログで紹介されていた例えが分かりやすかったのですが、「DynamoDBへの書き込み権限を追加したのに、なぜ関数が動かないのか」という混乱は、実はこの2つを取り違えていることが原因のケースが多いようです。「関数の中で何ができるか」と「関数自体がそもそも起動できるか」は、別の設定で管理されている、という理解が抜けていました。

さらにややこしい、イベントソースの種類による違い

この2種類の権限は、Lambdaをどう起動させるか(イベントソースの種類)によって、必要な設定が変わってきます。

  • プル型(DynamoDB Streams、Kinesis、SQSなど):Lambda自身がイベントソースをポーリング(定期的に確認)しに行く方式。この場合は「実行ロール」にそのサービスへの読み取り権限を設定するだけで済み、呼び出し権限の設定は不要
  • プッシュ型(S3、SNS、EventBridgeなど):イベントソース側からLambdaへ能動的に呼び出しが発生する方式。この場合は「呼び出し権限(リソースベースポリシー)」の設定が必須になる

「DynamoDB StreamsはIAMロールだけで動くのに、なぜS3トリガーは別の権限設定が必要なのか」という疑問は、まさにこのプル型・プッシュ型の違いに起因していました。試験でも、どちらの方式かによって設定すべき権限が変わる、という形で問われる可能性が高そうです。

DynamoDB:QueryとScanの根本的な違い

もう一つの弱点だったDynamoDBの取得方法について整理します。

  • Query:パーティションキー(必要に応じてソートキーも)を指定して、該当するデータだけをピンポイントで取得する
  • Scan:テーブル内の全データを一旦読み込んでから、条件に合うものだけを絞り込む

Scanは「まず全部読んでから絞り込む」という動き方をするため、テーブルのデータ量が増えるほど、パフォーマンスが劣化していきます。ある検証記事では、データが10万件を超えたあたりからUXに影響が出始め、100万件規模になると数十秒〜2分以上の遅延が発生する、という具体的な数字が示されていました。実際に0.5KBのレコード100万件で比較した実験では、Scanが16秒、Queryが10秒という結果も紹介されており、データ量が増えるほどこの差はさらに開いていくとされています。

Scanを避けるための、GSI(グローバルセカンダリインデックス)という選択肢

「パーティションキーに含まれていない属性で絞り込みたい」という場面は、実務でもよく出てきます。この時、安易にScanで対応するのではなく、GSIという「別の切り口で作る、もう1つの索引」を用意しておくことで、Queryのまま効率的に検索できるようになります。

# 例:投稿データを「公開状態」で絞り込み、日付順に取得したい場合
GSIのパーティションキー:type(例:public)
GSIのソートキー:created_at

このようにGSIを設計しておけば、Scanに頼らず、DynamoDB側で絞り込みとソートの大部分を完結できます。「Scanを使う=設計を見直すべきサイン」というくらいの意識を持っておくと良さそうです。

なぜこの2つが試験で狙われやすいのか

どちらも「一見動きそうに見えるが、実務では問題が起きる」という性質の知識です。IAM権限の設定を間違えても、エラーメッセージから原因を特定するのに時間がかかりますし、Scanを使ったコードも、少量のデータでテストしている間は問題なく動いてしまいます。本番相当のデータ量や、権限の細かい違いを問う設問に対応するには、こうした「見た目では気づきにくい落とし穴」を事前に知っておくことが、まさに実務経験の有無を測る狙いなのだと感じました。

まとめ

  • Lambdaには「実行ロール権限(何ができるか)」と「呼び出し権限(誰が起動できるか)」という別々のIAM許可がある
  • プル型イベントソースは実行ロールの権限のみ、プッシュ型は呼び出し権限の設定が別途必要
  • DynamoDBのScanはデータ量が増えるほど大きくパフォーマンスが劣化する
  • パーティションキーに含まれない属性で絞り込みたい場合は、GSIを設計してQueryで対応するのが基本

模擬試験で解けなかった悔しさはありますが、今回のようにピンポイントで理解を掘り下げられたので、次の演習でどう変わるか楽しみです。それでは、また明日!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次