AWS認定資格 WEB問題集&徹底解説

デベロッパー–アソシエイト

正解 C問題
分野3:デプロイ タスクステートメント3.1:AWS にデプロイするアプリケーション成果物の準備
合格に向けて、もっと深く学習する
豊富な問題と詳細なAWSサービス解説を、24時間無料でお試しいただけます
プレミアム会員機能を無料で試す ❯
問題文と選択肢
あるデータ分析チームは、Python 3.12 ランタイムの AWS Lambda 関数で、Amazon S3 にアップロードされた CSV ファイルを整形し、結果を Amazon DynamoDB テーブルへ書き込む処理を実装しています。この処理には Lambda ランタイムに標準では含まれていない pandas ライブラリが必要です。関数は、コンソールから直接 .zip ファイルをアップロードする方法でデプロイする予定です。

実行時に pandas をインポートできるようにするには、デプロイパッケージをどのように作成すればよいですか。
  • デプロイパッケージに pandas を記載した requirements.txt ファイルを含めておけば、初回実行時に Lambda がそれを読み取り、必要なライブラリを自動的にインストールする。
  • pandas のライブラリ一式を Amazon S3 にオブジェクトとして保存し、そのオブジェクトの URI を関数の環境変数に設定すれば、実行時に Lambda が自動的にダウンロードしてライブラリパスに追加する。
  • ローカル環境で pandas をインストールし、インストールされたライブラリ一式と関数コードを同じフォルダにまとめたうえで、1つの zip ファイルとして圧縮してアップロードする。
  • 関数コードだけを zip 化したファイルと、pandas のライブラリ一式だけを zip 化したファイルを別々に作成し、コンソールから2つのパッケージとして同じ関数にアップロードする。
解説 頻出度★★★★
この問題は、「ランタイムに含まれない外部ライブラリ × コンソールから .zip を直接アップロード」の要件で、依存ライブラリを関数コードと一緒に 1 つの zip のルートへ同梱するという Lambda デプロイパッケージの基本を選べるかがポイント

A. デプロイパッケージに pandas を記載した requirements.txt ファイルを含めておけば、初回実行時に Lambda がそれを読み取り、必要なライブラリを自動的にインストールする。

Lambda の .zip デプロイでは、実行環境が requirements.txt を読み取って依存関係を解決することはない。requirements.txt を同梱しても、単なるテキストファイルとして関数と一緒に配置されるだけで、pandas はインストールされない。
依存関係の解決はデプロイパッケージを作る側(ビルド時)の責任であり、AWS SAM や CDK、コンテナイメージのビルドなど「パッケージを組み立てる工程」で pip を走らせる必要がある。
実行時には ImportError(No module named 'pandas') で失敗するため、要件を満たさない。

B. pandas のライブラリ一式を Amazon S3 にオブジェクトとして保存し、そのオブジェクトの URI を関数の環境変数に設定すれば、実行時に Lambda が自動的にダウンロードしてライブラリパスに追加する。

Lambda に、環境変数で示された S3 オブジェクトを実行時に自動ダウンロードしてライブラリパスへ組み込む機能は存在しない
Amazon S3 が Lambda のデプロイで登場するのは、デプロイパッケージ(zip)そのものの受け渡しとしてであり、パッケージが 50 MB を超えてコンソールから直接アップロードできない場合に S3 の URI をコードソースとして指定する、という使い方になる。実行時に環境変数を見てマウントするわけではない。
関数コード内で自前で S3 からダウンロードして /tmp へ展開し sys.path に追加することは理屈上は可能だが、コールドスタートのたびに取得が発生し、本問のように「自動的に」行われるものでもない。

正解

C. ローカル環境で pandas をインストールし、インストールされたライブラリ一式と関数コードを同じフォルダにまとめたうえで、1つの zip ファイルとして圧縮してアップロードする。

これが Lambda の .zip デプロイパッケージの標準的な作り方。pip install --target ./package pandas のようにライブラリを専用フォルダへインストールし、その中身と関数コード(lambda_function.py)を同じ zip のルートに並べて圧縮する。
ハンドラーコードと依存関係は必ず .zip のルートに置く必要があり、サブディレクトリのままだと Lambda は関数を実行できない。
圧縮後 50 MB 未満であればコンソールから直接アップロードでき、本問の「コンソールから .zip をアップロードする」前提にも合致する。なお pandas や NumPy のように C 拡張を含むライブラリは、Lambda の実行環境(Amazon Linux)と互換性のある manylinux ホイールを取得する必要がある点に注意。

D. 関数コードだけを zip 化したファイルと、pandas のライブラリ一式だけを zip 化したファイルを別々に作成し、コンソールから2つのパッケージとして同じ関数にアップロードする。

1 つの Lambda 関数に紐づけられるデプロイパッケージは常に 1 つだけで、2 つ目をアップロードすれば単に上書きされる。関数コードとライブラリを別々の zip として「同じ関数に 2 つ」アップロードすることはできない。
ライブラリだけを分離したい場合の正しい手段は Lambda レイヤーで、レイヤーは関数のデプロイパッケージとは別のリソースとして発行し、関数にアタッチすると /opt/python へ展開されて import できるようになる。
本問はコンソールから .zip をアップロードする前提であり、レイヤーを使うとしても「2 つのデプロイパッケージ」という手順にはならないため不適。

これだけ覚える(記憶フック)
Lambda は pip を実行しない。外部ライブラリは自分で同梱(zip かレイヤー)が原則。
正解への思考ルート 問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。
要件 判断ポイント
pandas は Lambda ランタイムに標準では含まれていない 依存ライブラリはデプロイパッケージを作る時点で解決する。Lambda が実行時に pip を走らせることはない
→選択肢(A)を消す
実行時に import できる状態にする ライブラリ一式と関数コードを同じ zip のルートに置けば、そのまま import できる
→選択肢(C)が正解
Amazon S3 の使いどころを取り違えない S3 はデプロイパッケージ(zip)自体の置き場所(50 MB 超のとき必須)。環境変数で示したライブラリを実行時に自動取得する仕組みはない
→選択肢(B)を消す
コンソールから直接 .zip をアップロードする 1 つの関数に紐づくデプロイパッケージは 1 つだけ。ライブラリを分離するならレイヤーという別リソースになる
→選択肢(D)を消す
pandas はネイティブコード(C 拡張)を含む manylinux ホイール(--platform manylinux2014_x86_64 など)で Lambda の実行環境・アーキテクチャに合わせて取得する
→選択肢(C)が正解
ひっかけポイント
  • 「requirements.txt を入れておけば勝手に入る」は Elastic Beanstalk や SAM/コンテナのビルド工程の話。Lambda の .zip デプロイでは、同梱しても単なるテキストファイルとして置かれるだけで何も起きない
  • 「S3 に置く」は Lambda と相性が良さそうに見えるが、S3 が担うのは zip そのものの受け渡し(50 MB 超で必須)。ライブラリを個別に置いて実行時にマウントする機能は存在しない
  • 選択肢 D は Lambda レイヤーの記憶を刺激するひっかけ。レイヤーは「2 つ目のデプロイパッケージ」ではなく、別リソースとして発行して関数にアタッチし /opt/python へ展開される
  • zip の作り方も頻出のミス。package フォルダごと固めて package/pandas/... という階層になっていると import できない。中身を .zip のルートへ直接展開する
出題バリエーション 同じ知識が本番では条件を変えて出題されます。
問題文がこう変わったら 正解はこう変わる
「同じライブラリを複数の関数で共有したい」 Lambda レイヤーにまとめてアタッチするのが正解軸に(/opt/python へ展開・関数あたり最大 5 レイヤー)。
「デプロイパッケージが50 MB を超えてコンソールからアップロードできない」 S3 にアップロードし、その URI をコードソースとして指定してデプロイするのが正解に(環境変数ではない)。
「依存関係が巨大で解凍後 250 MB を超える .zip の上限を超えるため、コンテナイメージ(最大 10 GB)でのデプロイが正解に浮上。
「関数を arm64(Graviton) で動かす」 manylinux2014_aarch64 のホイールでビルドし直す必要。x86_64 用のままだと実行時に import エラー。
「デプロイ後に Unable to import module 'lambda_function' が出る」 zip のルート構成、またはハンドラー設定(ファイル名.関数名)の誤りが論点に変わる。
関連サービスの解説 Amazon Simple Storage Service (Amazon S3)
AWS Lambda
リファレンス この問題を解くために必要な知識を扱う公式ドキュメントです。
知識項目 公式ドキュメント
Python Lambda 関数の .zip デプロイパッケージ作成(依存ライブラリの同梱と manylinux ホイール) .zip ファイルアーカイブで Python Lambda 関数をデプロイする - AWS Lambda
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 29%
No.17 解説
あるデータ分析チームは、Python 3.12 ランタイムの AWS Lambda 関数で、Amazon S3 にアップロードされた CSV ファイルを整形し、結果を Amazon DynamoDB テーブルへ書き込む処理を実装しています。この処理には Lambda ランタイムに標準では含まれていない pandas ライブラリが必要です。関数は、コンソールから直接 .zip ファイルをアップロードする方法でデプロイする予定です。

実行時に pandas をインポートできるようにするには、デプロイパッケージをどのように作成すればよいですか。
  • デプロイパッケージに pandas を記載した requirements.txt ファイルを含めておけば、初回実行時に Lambda がそれを読み取り、必要なライブラリを自動的にインストールする。
  • pandas のライブラリ一式を Amazon S3 にオブジェクトとして保存し、そのオブジェクトの URI を関数の環境変数に設定すれば、実行時に Lambda が自動的にダウンロードしてライブラリパスに追加する。
  • ローカル環境で pandas をインストールし、インストールされたライブラリ一式と関数コードを同じフォルダにまとめたうえで、1つの zip ファイルとして圧縮してアップロードする。
  • 関数コードだけを zip 化したファイルと、pandas のライブラリ一式だけを zip 化したファイルを別々に作成し、コンソールから2つのパッケージとして同じ関数にアップロードする。

(会員限定)当問題の評価をお願いします。改善に活用します。

会員機能

お役立ち情報

姉妹サイト

アンケート

サイト情報