助け合いフォーラム
ソリューションアーキテクトはコスト削減のためにどのような提案をすべきか。
正解
RDSインスタンスの停止・起動を実行するLambda関数を作成する。Amazon EventBridgeでスケジュールを作成し、前述のLambda関数をターゲットに指定する
解説
Amazon RDSは従量課金制で、RDSインスタンスの起動時間に対して料金が発生します。設問のRDSインスタンスは1日12時間しか利用されないので、それ以外の時間帯は停止することでコストの削減が可能です。
AWS Lambdaはサーバーレスでプログラムのコードを実行できるサービスです。Lambda関数にRDSインスタンスへのアクセス権限を持つIAMロールを付与することで、RDSインスタンスの停止・起動を実行できるコードが作成できます。
Amazon EventBridge(CloudWatch Events)は、AWS上のリソースの状態変化やスケジュールに応じてアクションを実行することができるサービスです。イベントルールを定義する際、トリガーとなるものを「イベントソース」と呼び、行う処理のことを「ターゲット」と呼びます。EventBridgeでスケジュールを作成し、ターゲットにLambda関数を指定することで、毎日決まった時間にLambda関数を実行できます。
Lambdaは実行時間と選択したメモリの容量に対して課金されます。リクエストのない期間は料金が発生しないのでRDSインスタンスの停止と起動の1日2回の実行であれば、RDSインスタンスを起動させ続けるよりもLambdaにかかる料金の方が安価になります。なお、EventBridgeは無料で利用できます。
LambdaとEventBridgeを利用し、毎日自動的にRDSインスタンスを停止・起動する仕組みを作ることで、システムにかかるコストを削減できます。
したがって正解は
・RDSインスタンスの停止・起動を実行するLambda関数を作成する。Amazon EventBridgeでスケジュールを作成し、前述のLambda関数をターゲットに指定する
です。
その他の選択肢については、以下のとおりです。
・RDSインスタンスのオプションから、自動で停止・起動するスケジュールを作成する
RDSインスタンスに自動で停止・起動するオプションはないので、誤りです。
・EC2インスタンスをスポットインスタンスで契約する
スポットインスタンスはオンデマンドインスタンスよりも低価格で利用できる購入オプションですが、スポットインスタンスの需要が増加した場合や供給が減少した場合、インスタンスが中断される可能性があります。
本設問のEC2インスタンスは24時間ジョブが起動しており、インスタンスが中断されるとアプリケーションの動作に影響を及ぼすので、誤りです。
・Amazon ElastiCacheのキャッシュを利用して、RDSインスタンスへのアクセスを減らす
Amazon RDSはインスタンスの起動時間に対して課金されます。キャッシュを利用することでRDSインスタンスの負荷は下げられますが、RDSインスタンスの利用料金は変わりません。また、ElastiCacheの利用料金が別途かかります。
システムのコスト削減にはならないので、誤りです。
参考
【AWS Lambda】
開発したプログラムを動作させるためには、通常、実行環境となるサーバーが必要です。サーバーは、構築時にはOSやミドルウェア、ネットワークなどを設定し、場合によっては可用性や耐障害性の検討も必要です。また、運用時にはサーバーの監視や動作状況に応じたスケーリング、さらにセキュリティパッチの適用なども行う必要があります。プログラム開発者にとって、これらサーバーの構築および運用は負担になりがちです。
AWS Lambda(ラムダ)はサーバーレスでプログラムのコードを実行できるサービスです。サーバーレスとはAmazon EC2などのサーバーを必要とせず、リクエスト発生時にだけプログラムが実行されるアーキテクチャのことです。
Lambdaを利用すると次のようなメリットがあります。
・プログラム実行環境の構築や運用が必要なくなる
・プログラムはリージョン内の複数のAZに分散して配置される(耐障害性・可用性の向上)
・プログラムへのリクエスト数に応じたスケーリングが自動的に行われる(拡張性の向上)
以上のメリットから、開発者はプログラムの開発に集中できるようになります。
Lambdaで実行されるコードを「Lambda関数」といいます。Lambda関数はJava、Node.js 、Pythonなど様々な開発言語に対応しています。
Lambda関数の実行時間は1回につき最長15分で、実行時間と選択したメモリの容量に対して課金されます。そのため実行時間が15分以上になる処理や、常時稼働が必要なアプリケーションには向いていません。
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エンドポイントを経由します。
【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の種類により異なります。
イベントブリッジが管理する対象
ジョブのタイミングが時間指定であると問題には書いてないので、きめられたスケジュールではなく、lambaでRDSを起動するのが正しい。
eventbridge のスケジュールは cron と rate しか対応していないので、それらに対応しているジョブだと問題文に書くべきだ。そうでないと正解がない。
ChatGPTに聞いてみましたー。
-----わたし-----
次の問題を解いてください。
加工食品を扱う会社は、工場の管理システムにAmazon EC2とAmazon RDSを利用している。EC2インスタンスで動作するアプリケーションは24時間ジョブが起動しているが、RDSインスタンスに保存しているデータは工場が稼働する朝8時から夜20時の間しか利用されない。会社はアプリケーションの動作に影響を及ぼすことなく、システムにかかるコストを最小化したいと考えている。
ソリューションアーキテクトはコスト削減のためにどのような提案をすべきか。
RDSインスタンスの停止・起動を実行するLambda関数を作成する。Amazon EventBridgeでスケジュールを作成し、前述のLambda関数をターゲットに指定する
RDSインスタンスのオプションから、自動で停止・起動するスケジュールを作成する
EC2インスタンスをスポットインスタンスで契約する
Amazon ElastiCacheのキャッシュを利用して、RDSインスタンスへのアクセスを減らす
-----ChatGPT-----
このシナリオでは、Amazon RDSインスタンスが一日のうちの特定の時間帯(朝8時から夜20時まで)しか利用されていないとのことなので、この特性を利用してコストを削減することが考えられます。具体的には、RDSインスタンスを稼働していない時間帯に停止することでコストを節約できます。
そのため、以下の提案が適当でしょう。
RDSインスタンスの停止・起動を実行するLambda関数を作成する。Amazon EventBridgeでスケジュールを作成し、前述のLambda関数をターゲットに指定する
この提案により、RDSインスタンスは工場が稼働していない時間帯に自動的に停止し、稼働時間帯に再起動します。この結果、RDSインスタンスの運用コストを削減することができます。
それ以外の選択肢については、以下の通りです。
RDSインスタンスのオプションから、自動で停止・起動するスケジュールを作成する: これは不可能です。現時点では、RDSは自動的なスケジュール停止・起動の設定機能を提供していません。
EC2インスタンスをスポットインスタンスで契約する: スポットインスタンスはコスト削減に有効ですが、その利用は中断される可能性があります。24時間稼働が必要なアプリケーションには不適切です。
Amazon ElastiCacheのキャッシュを利用して、RDSインスタンスへのアクセスを減らす: これは一部のシナリオでコストを節約する可能性がありますが、本シナリオではRDSインスタンスが一部の時間帯しか稼働していないという情報が与えられているため、ElastiCacheを利用するよりもRDSの停止・起動の自動化の方が明確なコスト削減効果が期待できます。
コメント
設問およびCafeLateさんの回答に対して、koyakeiさんが「どの点」で「何」に疑問を持たれているのかが、
今までの流れからはいまいち見えてこないのですが…
調べてみた限りでの回答ですが、
① >lambaでRDSを起動するのが正しい。
AWS Lambdaは単独起動しないサービスです。
必ず何がしかのトリガーが必要で、本設については「EventBbridge」が該当です。
② >eventbridge のスケジュールは cron と rate しか対応していないので~
EventBridgeを使用したLambda起動については、cron式になるようです。
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-run-lambda-schedule.html
③ >「朝8時から夜20時までと指定され~」→「ここが論理飛躍してます。見做さない事もできる。」
ここでは、
「RDSインスタンスに保存しているデータは工場が稼働する朝8時から夜20時の間しか利用されない。」
と明言されています。
であれば、RDSが起動していればいい時間は「朝8時から夜20時まで」と取るのが自然でしょう。
そして、解答の大前提は「コスト削減のためにどのような提案」とあるので、
『起動の必要がない時間帯でインスタンスを停止する』が最適解でしょう。
であれば、
「朝8時に『RDSインスタンスを起動するジョブ』をEventBridgeでトリガーする」
「夜20時に『RDSインスタンスを停止するジョブ』をEventBridgeでトリガーする」
という解答で問題ないでしょう。
むしろ、「見做さない事もできる」のであれば、どのような「見做し」があるのかを
提示いただかないと、解答のしようもありません。
コメント
この投稿に対して返信しませんか?
C CafeLate
2023/05/22 18:11
-----わたし----- この問題についての、次の意見は正しいですか? ジョブのタイミングが時間指定であると問題には書いてないので、きめられたスケジュールではなく、lambaでRDSを起動するのが正しい。 eventbridge のスケジュールは cron と rate しか対応していないので、それらに対応しているジョブだと問題文に書くべきだ。そうでないと正解がない。 -----ChatGPT----- この問題に関するご意見について、以下の通り詳細に説明いたします。 1. "ジョブのタイミングが時間指定であると問題には書いてないので、きめられたスケジュールではなく、lambaでRDSを起動するのが正しい。" 問題文から、工場の稼働時間が朝8時から夜20時までと指定されており、その間だけRDSインスタンスが必要であると解釈できます。これはある種のスケジュールと見なすことができます。そのため、このスケジュールに基づいてLambdaを使用してRDSインスタンスを起動および停止することは、RDSの使用時間を最適化し、コストを節約する可能性がある適切な解決策と言えます。 2. "eventbridge のスケジュールは cron と rate しか対応していないので、それらに対応しているジョブだと問題文に書くべきだ。そうでないと正解がない。" EventBridgeのスケジュール式は、実際にはcron式とrate式の2つの形式をサポートしています。この問題の文脈では、具体的には、朝8時に起動し、夜20時に停止するようなスケジュールをcron式で表現することが可能です。したがって、この問題には適切な解決策が存在します。 したがって、上記の意見は正確とは言えません。問題文は時間帯が明示されており、EventBridgeとLambdaを使用してそのスケジュールに基づいてRDSインスタンスを起動および停止することが、この特定の問題の適切な解決策であると理解されます。