助け合いフォーラム

AWS

AWS ソリューションアーキテクト - アソシエイト(SAA-C03)
問題ID : 34973
問題を開く
ある会社は、オンプレミスのシステムの一部をAWSへ移行している。移行するにあたり、AWS Site-to-Site VPNを契約してオンプレミスとAWSネットワークを接続した。オンプレミスで稼働していたアプリケーションをAWS Lambdaに移行する計画を進めているが、Lambda関数からオンプレミス内のプライベートネットワーク上にあるデータベースにアクセスする必要がある。なお、システム移行先のVPCは、デフォルトルートが仮想プライベートゲートウェイ(VGW)に設定されている。
要件を満たすには、どうすればよいか。

正解

Lambda関数がVPCへアクセスできるように、VPCアクセスの設定をする

解説

設問の要件は「Lambda関数からオンプレミス内のプライベートネットワーク上にあるデータベースにアクセスする」です。そのためには、Lambda関数からAWS Site-to-Site VPN経由でオンプレミスのデータベースにアクセスする必要があります。

AWS Site-to-Site VPN(サイト間VPN)は、カスタマーゲートウェイ(オンプレミスのルーター)とVPCの仮想プライベートゲートウェイ(VGW)を、インターネットVPNで接続するサービスです。Site-to-Site VPNはインターネット上に仮想の専用線であるVPNトンネルを張り、IPsecという暗号技術を使って通信を保護します。


Lambda関数は、Lambda専用のセキュアなVPCに配置されています。このLambda専用のVPCからは、インターネットや、インターネットを経由してパブリックサブネット内のAWSリソースにはアクセスできますが、パブリックに公開されていないAWSリソースへはアクセスできません。


Lambda関数からAWS Site-to-Site VPN経由でオンプレミスのデータベースにアクセスするには、Lambda関数をVGWが接続されているVPCに関連付ける「VPCアクセス」の設定をします。VPCアクセスを設定すると、Lambda関数に関連付けたVPCのサブネットに接続用のENI(Elastic Network Interface)を作成してサブネットへアクセスできるようになります。VPCアクセスを設定したLambda関数は、ENIを作成したサブネットへアクセスできるようになる代わりに、インターネットへアクセスできなくなります。


アクセス先のVPCにはデフォルトルートがVGWに設定されているので、Lambda関数はVGWを介してAWS Site-to-Site VPNを経由し、オンプレミスのデータベースに接続できます。また、VPCアクセス設定で、Lambda関数がオンプレミスのデータベースと通信できるように、セキュリティグループに適切な設定をします。


したがって正解は
・Lambda関数がVPCへアクセスできるように、VPCアクセスの設定をする
です。

[Lambda関数のVPCアクセス設定画面]
VPCアクセスでは、アクセス先のVPCとサブネット、Lambda関数のセキュリティグループを設定します。


その他の選択肢については、以下のとおりです。

・Lambda関数がAWS Site-to-Site VPN経由でオンプレミスへアクセスできるように、VPCのルートテーブルを更新する
VPCのルートテーブルはすでにデフォルトルートがVGWに設定されているので更新する必要はありません。よって、誤りです。

・Lambda関数をインターネットに接続できるようにして、インターネット経由でオンプレミスへアクセスする
データベースはオンプレミスのプライベートネットワーク上にあります。インターネット経由ではアクセスできないので、誤りです。
また、Lambda関数はデフォルトでインターネットへ接続可能です。

・Lambda関数から直接仮想プライベートゲートウェイにアクセスするようにコードを書き換える
ネットワークアクセスはプログラムのコードでは制御できないので、誤りです。

参考

【AWS Lambda】
AWS Lambda(ラムダ)はサーバーレスでプログラムのコードを実行できるフルマネージドサービスです。サーバーレスとは、EC2インスタンスなどのサーバーを必要とせずリクエスト発生時にだけプログラムが実行されるアーキテクチャのことです。サーバーレスアーキテクチャでは、インフラストラクチャの管理は完全にAWSによって行われます。

Lambdaを利用すると次のようなメリットがあります。
・プログラム実行環境の構築や運用が不要になる
・プログラムはリージョン内の複数のAZに分散して配置される(耐障害性・可用性の向上)
・プログラムへのリクエスト数に応じたスケーリングが自動的に行われる(拡張性の向上)

開発したプログラムを動作させるためには、通常、実行環境となるサーバーが必要です。サーバー管理は構築・運用ともに負担の大きな作業ですが、Lambdaを利用することにより煩雑な業務を行わなくて済むようになりプログラムの開発に集中できます。

【Lambda関数】
Lambdaで実行されるコードを「Lambda関数」といいます。
Lambda関数は以下のような特徴があります。
・開発言語:Java、Node.js、Pythonなど様々な開発言語に対応
・実行時間:最長15分
・課金方式:リクエスト数に基づく課金と実行時間(単価はメモリ量に依存)に基づく課金の合計
・実行タイミング:特定のイベントがトリガーとして発生したときに実行

ユーザーは、Lambda関数を実行するため
・Lambda関数のコード作成と更新、環境変数設定、IAMロール設定など、アプリケーションに関する設定
・Lambda関数を実行するメモリサイズや最大実行時間の指定など、リソースに関する設定
などを行います。

実行時間が15分以上になる処理や常時稼働が必要なアプリケーションには適していないので、EC2インスタンスやコンテナなどで運用する検討が必要です。

Lambdaを1年以上継続して利用する場合は「Compute Savings Plans」で契約すると、サービスを割引価格で利用できます。Compute Savings Plansは1年または3年の期間、一定のサービス使用量(1時間あたりの利用料金)を決めて契約することで、通常よりも低価格になる購入オプションです。

【Lambda関数のトリガー】
Lambda関数実行の起点となるイベントを「トリガー」といいます。以下はトリガーとして設定できるイベントの一例です。
・Amazon S3バケットにオブジェクトが作成された時
・Amazon DynamoDBのテーブルに変更があった時
・Amazon SQSのキューにメッセージが追加された時
・Amazon SNSからトピックが通知された時
・Amazon API Gateway経由で直接Lambda関数が呼び出された時

例えば、ユーザーからアップロードされた画像ファイルがS3バケットに保存(オブジェクトが作成)された時に、Lambda関数が実行されて画像ファイルの情報をDynamoDBに書き込むといった利用方法があります。


【Lambda関数のアクセス権限】
Lambda関数には実行ログを出力するために、CloudWatch Logsへのアクセス権限が割り当てられています。デフォルトではCloudWatch Logs以外へのアクセス権限はないので、Lambda関数から他のAWSサービスへアクセスさせたい場合はアクセス権限の設定が必要です。Lambda関数のアクセス権限は、他のAWSサービスへのアクセス権限を持つIAMロールによって付与します。その際、Well-Architected Frameworkの「最小権限の原則」に基づき、コード実行に必要な最低限の権限のみ割り当てることが推奨されています。

[Lambda関数にDynamoDBへのアクセス権限を割り当てる時のイメージ]


【Lambda関数のVPCアクセス】
作成したLambda関数はLambda専用のセキュアなVPCに配置されます。このLambda専用のVPCからは、インターネットや、インターネットを経由してパブリックサブネット内のAWSリソースにはアクセスできますが、プライベートサブネット内のAWSリソースへはアクセスできません。


Lambda関数からプライベートサブネット内のAWSリソースへアクセスさせたい場合は「VPCアクセス」の設定をします。VPCアクセスではアクセスしたいAWSリソースのあるVPCやサブネットの選択と、Lambda関数のセキュリティグループを設定します。VPCアクセスを設定するとLambda関数がサブネット毎に接続用のENI(Elastic Network Interface)を作成して、プライベートサブネット内のAWSリソースへアクセスします。
VPCアクセスを設定したLambda関数は、ENIを作成したサブネットへアクセスできるようになる代わりに、インターネットへアクセスできなくなります。


VPCアクセスを設定したLambda関数からインターネットへアクセスしたい場合は、プライベートサブネットからインターネットへアクセスする方法と同様に、NATゲートウェイまたはNATインスタンスを経由します。また、インターネットを経由せずにパブリックなAWSリソースへアクセスしたい場合は、VPCエンドポイントを経由します。


【Lambda関数の同時実行】
Lambda関数は、発生したイベントの数だけ同時実行されます。ある特定の時点で、実行中のLambda関数の個数を「同時実行数」といいます。同時実行数には上限値が設定されており、東京リージョンでのデフォルトの上限値は1000です。
この上限値はアカウント全体のすべてのLambda関数に対して適応されます。そのため、ある特定のLambda関数で多数の同時実行が進行している場合、別のLambda関数の実行が制限される可能性があります。このような状況を避けるため、事前に特定のLambda関数に対して「同時実行」の数を予約できます。たとえば200を予約しておくと、その関数は200まで同時実行ができ、他の関数は合計して800までの同時実行が可能となります。

Lambda関数が初めて実行される場合や一定期間実行されていない場合は、Lambda関数の実行環境であるランタイム環境の準備に時間がかかるため、Lambda関数の処理が開始されるまで時間がかかります。(コールドスタート)
一方、同じLambda関数に対するリクエストが継続的に発生する場合は、ランタイム環境が再利用されるため準備処理が省略され、Lambda関数の開始までの時間が短くなります。(ウォームスタート)

Lambda関数のランタイム環境を事前に準備しておくことを「プロビジョニング」といい、「プロビジョニングされた同時実行」を予約することで、Lambda関数の起動時間を短縮し、レスポンス時間を改善できます。これは、Lambda関数の処理でレイテンシーの低減が重要な場合に特に有効です。(ただし「プロビジョニングされた同時実行」を予約する場合、別途料金がかかります)

【Amazon API Gateway】
Amazon API GatewayはAWSサービスと連携するAPIの作成や管理ができる機能です。API(Application Programming Interface)とは、クライアントからのリクエストをアプリケーションサーバーに送り、アプリケーションサーバーからのレスポンスをクライアントへ返す接続口(インターフェイス)のことです。
下記はAPI Gatewayで作成したHTTP APIの実行例です。クライアントからHTTP(HTTPS)などでAPIを呼び出して、テキストやJSONなどの形式で得たい情報を取得します。


API Gatewayはマネージドサービスなので、Lambdaと組み合わせることで完全にサーバーレスでWebアプリケーションを実行できます。
例えばクライアントからのHTTPリクエストをAPI Gatewayで受信し、それをトリガーとしてLambda関数を実行させ、レスポンスをAPI Gateway経由で返すことができます。

API Gatewayで作成できるAPIは、クライアントとサーバー間の接続方法や機能によって以下の3種類があります。

■REST API(RESTful API)
クライアントからのリクエストに対してレスポンスを返す形式のAPIです。サーバーが扱う情報はURI(URL)で定義されており、クライアントはHTTP(HTTPS)でリクエストを送信することでレスポンスを得ます。
データベースの検索など、クライアントからのリクエストに応答するアプリケーションで使われます。
なお、REST API(RESTful API)とはREST(REpresentational State Transfer)という原則にのっとったAPIのことです。通信の状態が管理されない「ステートレス」な接続方式です。

[REST APIの処理イメージ]


■HTTP API
REST APIよりも低遅延かつコスト効率を高くする目的で設計されたAPIです。REST APIと同じ形式のAPIですが、APIキャッシュ(後述)を利用できないなど細かな差異があります。

■WebSocket API
クライアントとサーバー間でリアルタイムな情報のやり取りを目的とするAPIです。REST APIとは違い、継続的なデータの送受信を行えます。
チャットや株価情報のような常に情報をモニタリングするようなアプリケーションで使われます。
なお、WebSocket APIとはサーバー・クライアント間で双方向のセッションを確立できる技術を利用したAPIのことです。通信の状態を管理される「ステートフル」な接続方式です。

[WebSocket APIの処理イメージ]


【API キャッシュ】
Amazon API Gatewayにはクライアントへ送信したデータを保存する「API キャッシュ」機能があります。REST APIではどのクライアントからでも同一のリクエストであれば同一のレスポンスになります。API キャッシュではクライアントに送ったレスポンスをAPI Gatewayでキャッシュし、再度同一のリクエストを受け取るとキャッシュからデータを返します。API キャッシュから応答を返すことにより、Lambda関数の実行を省略できるのでレスポンス速度が向上します。

【API GatewayのVPCリンク】
Amazon API Gatewayで作成したAPIはユーザーが管理するVPC外に配置されます。そのため、作成したAPIからインターネットを経由してパブリックサブネット内のAWSリソースにはアクセスできますが、プライベートサブネット内のAWSリソースへ直接アクセスすることはできません。



API Gatewayからプライベートサブネット内のAWSリソースへアクセスさせたい場合は「VPCリンク」を作成します。これにより、APIとプライベートサブネット内のリソースとの間でインターネットを経由しないセキュアな通信が可能になります。
VPCリンク作成時に、アクセスしたいAWSリソース(下図の例ではEC2インスタンス)を直接指定することはできません。Network Load Balancerを対象として指定します。※対象として指定できるリソースはAPIの種類により異なります。



【API Gatewayのオーソライザー】
API Gatewayのオーソライザーを使用すると、APIへのアクセス制御を実装することができます。オーソライザーには、Amazon Cognito(*)のユーザープールを使用する方法と、Lambda関数を使用する方法があります。
※ Amazon Cognito: モバイルアプリケーションやWebアプリケーション向けのユーザー認証機能を提供するサービス

前者は、Amazon Cognitoが提供するマネージド型の認証機能を使用するため、開発者は認証プロセスについて自身で管理する必要がありません。
後者は、開発者自身が認証プロセスをLambda関数で作成する必要があります。独自のロジックでAPIへのアクセス制御を実装できるため柔軟性は高くなりますが、セキュリティ対策など管理の複雑さが増加します。



[Cognitoユーザープールを使用したオーソライザーでのアクセス制御のイメージ]


[Lambda関数を使用したオーソライザーでのアクセス制御のイメージ]


【独自ドメイン名の使用】
API Gatewayで作成したAPIへアクセスするためのURLに、独自ドメイン名を設定することができます。独自ドメイン名を使用する場合、API Gateway側で独自ドメイン名の作成時に、AWS Certificate Manager(ACM)で管理されるSSL/TLS証明書を選択します。この時に使用する証明書は、APIのエンドポイントタイプによって異なる場合があります。リージョン別のエンドポイントを使用している場合には、同じリージョンのACMで発行またはインポートされた証明書を使用します。エッジ最適化(CloudFrontを組み合わせて使用する)エンドポイントを使用している場合には、us-east-1リージョンのACMで発行またはインポートされた証明書を使用します。

また、APIへアクセスするためのURLにワイルドカードを含んだ独自ドメイン名を使用することもできます。これにより、1つの独自ドメイン名を作成するだけで、「aaa.example.com」や「bbb.example.com」のようにサブドメインの異なる複数の独自ドメイン名をサポートすることが可能になります。この場合、指定する証明書も、ドメイン名にアスタリスクを含むワイルドカード証明書である必要があります。また、DNSサーバ側のDNSレコードも、ワイルドカードを用いた独自ドメイン名を登録します。

[独自ドメイン名の設定画面]


【Canaryリリース】
API Gatewayでは、「ステージ」という概念を使用して、APIの異なるバージョンや開発段階を管理します。これにより、開発、テスト、本番などの異なる環境でAPIを個別に管理できます。

Canaryリリースは、新しいバージョンのAPIを段階的にリリースする方法です。まず、既存の本番ステージに新しいAPIバージョンをデプロイし、一部のトラフィックを新しいバージョンに向けます。例えば、初めは20%のトラフィックを新バージョンに割り当てます。新バージョンが安定して動作することが確認されたら、トラフィックの割合を徐々に増やしていき、最終的には全トラフィックを新バージョンに移行します。もし問題が発生した場合は、すぐに元のバージョンに戻すことができます。Canaryリリースを利用することで、リスクを分散し、ユーザーへの影響を最小限に抑えることができます。

[API GatewayでのCanaryリリースのイメージ図]
上に戻る

LambdaとVPC

公開日 2023/12/22

「Lambda関数は、Lambda専用のセキュアなVPCに配置されています。」と解説にありますが、Lambdaをユーザー管理のVPC内で動作させることができるため、VPC内で動作しているかどうかを問題文の条件に入れる必要があるように思います。

2023/12/22 13:33

「Lambdaをユーザー管理のVPC内で動作させることができる」というのはどこの情報からでしょうか?

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/foundation-networking.html#foundation-nw-connecting

Lambda 関数は、常に Lambda サービスが所有する VPC 内で実行されます。
VPCアクセスの設定によってユーザー管理のVPCにアクセスできるのであって、ユーザー管理のVPC内で動作させることはできない認識でした。


コメント

i incho

2023/12/22 18:06

「VPC内Lambda」で検索するとAWS以外のサイトで「VPC内でLambdaを動作させる」という話が盛んに語られてますが、AWS公式の情報はたしかに見つかりませんでした。AWS公式ではVPCのプライベートサブネットにENIを介して接続できるという説明になっているので、「VPC内で動作させる」というのは間違ってるのでしょうね。うかつでした。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?