AWS Startup ブログ

【週刊 Ask An Expert #13】Amazon ElastiCache for Memcached に割り当てるメモリサイズを増やすには!? AWS Loft Tokyo で受けた質問まとめ #AWSLoft

こんにちは、スタートアップ ソリューションアーキテクトの針原 (Twitter: @_hariby) です。好きな AWS サービスは Amazon SageMaker, Amazon Rekognition, AWS DeepLens [amazon.co.jp] です。相変わらず雨が多く、7月にしては涼しい日が続いていますが皆さんいかがお過ごしでしょうか。

さて、今回の週刊 Ask An Expert 第13回目をお届けします。「参考になったわ!」「ええ内容や!」と思っていただけたら、ぜひハッシュタグ #AWSLoft を付けてシェアしてください。もちろん、改善点・ご要望もお待ちしております。

Ask An Expert ?

皆さん AWS Loft Tokyo はご存知でしょうか?目黒セントラルスクエア17Fにある、AWS を利用中のスタートアップとデベロッパーのためのコワーキングおよびイベントスペースです。その一角に AWS のエキスパート – Solutions Architect (SA) や Cloud Support Engineer (CSE) – といった中の人に技術的な質問ができる、Ask An Expert カウンターがあります。そこでは毎月、来場者の方から100件以上にものぼるご相談をお受けしています。

ある日の Ask An Expert: 熱心なお客様と相談に乗る Solutions Architect 中武

この連載では、我々 AWS のエンジニアが Ask An Expert でどのような質問を受け、どのように対応しているのか、非常にざっくりと ご紹介していく「週刊 Ask An Expert」をお届けしていきます。他の AWS Loft 利用者がどんな質問をしているのか、自分が知らなかった新しいトピックはないか、Ask An Expert ってどんなところなのか、一緒に見ていきましょう!
※ 似たご質問をまとめたり、まとめにくいご質問を省いたりしているため、実際のご質問件数・内容とは異なる部分があります。

週刊 Ask An Expert #13 (2019/07/08 – 07/12)

この週の対応者は SA: 塚田・星野・中武・針原と CSE: 榎本・古野・関山でした。

Q: Stripe を組み合わせた有料動画配信サービスを AWS で構築したい。どのようなサービスを組み合わせるのがよいか。

購入情報、動画有効期限の管理は Amazon API Gateway + AWS Lambda + Amazon DynamoDB の一般的なアーキテクチャーを紹介しました。動画配信については AWS Elemental MediaConvert, Amazon S3, Amazon CloudFront の組み合わせを提案しました [Slides]。Stripe との連携についてはこちらの [Blog] もご参照下さい。

Q: Laravel フレームワークで Web アプリケーションを開発している。現状は Amazon EC2 インスタンス上で Web アプリケーションのコンテナと Memcached のコンテナを両方実行している。スケーラビリティを考慮して今後 Memcached 用 Amazon ElastiCache を使っていきたい。Amazon ElastiCache では Laravel など特定のフレームワーク向けの機能は提供されるか?また、Memcached に割り当てるメモリサイズを増やす場合はスケールアップでの対応となるか?

特定のアプリケーションフレームワーク向けの特別な機能は提供していません。Memcached クラスターは1つ以上のノードで構成され、クラスターに含まれるノードの種類毎にメモリサイズが異なります [Docs]。そのため少数の大きなノードでクラスターを構成するか、いくつかの小さなノードでクラスターを構成することでクラスターのメモリ要件を達成することができます。

Q: 論文をクローリングして内容を解析し、Elasticsearch のインデックスにドキュメントを追加する仕組みを開発している。現状は Amazon EC2 インスタンス上で各処理を実行する想定だが、他にどのような構成が考えられるか?

ヒアリングしたところ、現状はごく短時間で終了する処理ばかりだったため、データのクロールと Elasticsearch へのデータ格納は AWS Lambda or Amazon Elastic Container Service (Amazon ECS) Task による置き換えを提案しました。フロントエンドについては、Amazon Cognito + Amazon S3 による Single Page Application (SPA) での提供を1つの選択肢として提案しました。

Q: 開発中の Web アプリケーションへのアクセスを制限したい。どのような方法があるか。

Amazon Cognito による認証を求めるよう Application Load Balancer (ALB) の設定を変更し、認証ユーザーのみアプリケーションにアクセスする方法を紹介しました。

Q: AWS マネジメントコンソールへのログインや、Slack, JIRA など他サービスへのログインを一本化したい。どのような方法が考えられるか。AWS Directory Service も検討したが、現状開発者が5人しかいないためオーバースペックかもしれないと考えている。

Directory Service は現在の規模では費用対効果の観点から最適でない可能性を議論し、G Suite を既にご利用であることもふまえて使い慣れた G Suite 側へ統合することをご検討いただくよう案内しました [Blog]。

Q: Amazon Elastic Kubernetes Service (Amazon EKS) の Control Plane ログを Amazon CloudWatch Logs に保存する必要があるかどうか検討したい。

Amazon EKS のコントロールプレーンのログはログ種別ごとに有効/無効の切り替えが可能です。まずは要件を明確にしたうえで、必要なログから取得することを検討して下さい。

Q: AWS の Web アプリケーションに対する接続制限を行いたい。エンドユーザーの要件でデバイス認証への対応を求められている。どのような方法が考えられるか。なお 3rd party の ID プロバイダー (IdP) を利用予定です。

ALB の OpenID Connect (OIDC) 連携機能で IdP を連携先として指定し、そちらのデバイス認証機能をご利用いただく方法をご提案しました。

Q: Amazon CloudFront について。レンタルサーバー上の WordPress に Amazon CloudFront を通してアクセスするとき、Amazon CloudFront の「選択されたリクエストヘッダーに基づいたキャッシュ」を None にするとうまくアクセスできるが、Whitelistにしていくつかのヘッダーを選ぶと 502 になってしまう。None でも問題ないか?

選択されたリクエストヘッダーに基づいたキャッシュ (Cache Based on Selected Request Headers) [Docs] の用途と仕様を説明。何を Whitelisting するか、None にするかはコンテンツ次第で選んで頂くことをご案内しました。今回は wp-admin の管理画面での設定についてだったので、そもそもキャッシュは不要ということでキャッシュ無効(TTL を 0)にして Cache Based on Selected Request Headers は None にすればいいのでは、とお話ししました。Whitelist したときになぜ 502 が出たのかは、サーバー側ログが出ておらず確認できなかったため不明でした。

Q: Amazon CloudWatch Events から1分間隔で Lambda Function を呼び出している。0分に呼び出された Function の実行に1分以上要した場合、1分に Lambda Function が呼ばれないといったことは起こり得るか?Amazon CloudWatch Events で処理を実行した場合に前の処理が終わってなかったら次の処理は呼び出されるか?

以前の実行状況によらず、1分間隔で Lambda Function が実行されます。

Q: Amazon DynamoDB は Amazon RDS のようにデータ使用率を監視する必要はあるか。

Amazon DynamoDB のデータベーステーブルには任意の量のデータを保存できるため、Amazon RDS でいうところのディスクフルを未然に防止するための容量監視は不要です。

Q: 他のエンジニアが作成した AWS 環境の調査を行っている。DB のテーブル構成を調査したいが、本番に影響を与えずに行うにはどのような方法がよいか。可能であればローカル環境にデータをダウンロードすることは避けたい。

RDS for MySQL および Aurora MySQL をご利用であったため、前者向けにスナップショットから DB インスタンスを復元する方法 [Docs] と、後者向けにカスタムエンドポイント (READER) [Docs] の作成方法をお伝えしました。

Q: AWS Control Tower について質問したい。内部的な問題でアカウント作成に失敗し、AWS CloudFormation の処理がスタックしてしまった。AWS Service Catalog 側の作成された製品を削除することでスタックも削除できたが、アカウントが残ってしまった。再度アカウントを作成したいが、使いたいメールアドレスが中途半端に作成されたアカウントに紐づいたままになってしまっている。どうすればよいか。また、ガードレールをカスタムしたものは使えるか。

ルートユーザーの パスワード復旧 を実施いただき、中途半端に作成されたアカウントのメールアドレスを変更することで、別のアカウントでメールアドレスを再利用可能です。AWS ではアカウントのメールアドレスにエイリアスが設定されたメールアドレスも利用いただけるので、中途半端に作成されたアカウントのメールアドレスを一時的にエイリアス付きのものに変更できないかご検討ください。現状カスタマイズされたガードレールは使用できないため、AWS CloudFormation StackSets やサービスコントロールポリシーなどを個別に実装する必要があります。

Q: AWS Transfer for SFTP を LDAP と連携させたい。LDAP と連携する場合 Amazon API Gateway + AWS Lambda で独自の認証処理を組み立てる必要があると認識している。Lambda Function のカスタマイズの難易度や実装にかかる工数次第では別の方法を検討したいと思っている。サンプルからどの程度カスタマイズが発生するか。別途 AWS サポートにも質問している。

既に AWS サポートに同内容をお問い合わせいただいていたため、サポートと継続的にやり取りすることをお勧めしました。「Lambda Function のカスタマイズの難易度や実装にかかる工数次第では別の方法を検討したいと思っている」という背景情報は AWS サポートでも適切なご案内を差し上げるうえで重要であるため、背景情報を追加でお伝えいただくことをお願いしました。

Q: ALB + AWS WAF のセキュリティオートメーションを使いたいが、ALB のログではなくバックエンドの Amazon EC2 インスタンスに出力されたログを解析対象として使う必要がある。どうカスタマイズすればよいか。特定のレスポンスコードが一定期間のうちに一定回数検出された場合に X-Forwarded-For に格納されているクライアント IP アドレスの内訳を確認し、閾値に達している IP アドレスのみ AWS WAF の遮断対象に加えたい。

WAF Automation のカスタマイズではかえって工数がかかる可能性があるため、下記のアーキテクチャーを一案として紹介しました。

  1. Amazon EC2 インスタンスから Amazon CloudWatch Logs にログを連携
  2. メトリクスフィルターによる Alarm で一定期間内に特定のレスポンスコードが閾値を超過した回数記録されているかチェック
  3. Amazon SNS から Lambda Function を呼び出し、CloudWatch Logs Insights で集計
  4. 条件に合致する IP アドレスを抽出し、WAF の Rule を更新

Q: 画像にハッシュタグを付与し、タグベースで画像の検索を行いたい。画像は S3 バケットに格納しハッシュは何らかのデータベースに格納することを検討している。Elasticsearch は用途に適しているか、意見を伺いたい。

要件としては Elasticsearch が適しているように思われるが、Amazon Elasticsearch Service は現状ユーザー辞書に対応していないため、検索処理に求められる要件を確認する必要があります。なお、ユースケースを伺う限りでは、データ量ではなく検索リクエストの頻度や同時リクエスト数に重きをおいて初期サイジングを決めて、あとは負荷テストを実際に行ってボトルネックの特定とスケールアップ・スケールアウトを行っていくとよいと思われます。

Q: Amazon Pinpoint をプッシュ通知の用途で検討しているが、現状東京リージョンで提供されていない。従って別リージョンの Amazon Pinpoint 利用を考えている。別リージョンの Amazon Pinpoint を利用することに何か問題はあるか。

Apple Push Notification Service (APNs) および Firebase クラウドメッセージング (FCM) エンドポイントのロケーションを考慮すると、北米のリージョンを利用することは Push 通知の観点からむしろ好ましいと考えられます。Amazon Pinpoint エンドポイントが北米に存在することでユーザーの動向データを日本国内のデバイスから送信する際のレイテンシは増大しますが、動向データの送信はユーザー操作とは非同期に行われるようフロントエンド処理を実行することでユーザーエクスペリエンスへの影響は回避されますし、SDK によって自動的にそのように振る舞うため、開発者に意識していただく必要はありません。

Q: 大きなサイズ (数十 GB) のファイル分割処理を行いたい。なお、処理は1日に数件程度でリアルタイムにやる必要はない。

AWS Lambda の /tmp は 512 MB なので要件に合わなそうです [Docs]。Amazon S3 → Amazon SQS → AWS Elastic Beanstalk という構成も検討したが、EC2 スポットインスタンスを使いたいということだったので Amazon S3 → AWS Lambda/CloudWatch Events → AWS Batch などがフィットしそうということでお伝えさせて頂きました。

Q: AWS Lambda のタイムアウトが発生した。AWS Lambda のリクエスト ID は分かるが、AWS X-ray 上で該当リクエストのトレースを行うにはどうすればよいか。

X-Ray コンソールではいくつかの条件でフィルタリングやソートが出来るので、対象時間や条件を指定して確認してみて下さい。また、必要であればわざと AWS Lambda をタイムアウトさせて AWS X-Ray でどのようになるかを見ることでデバッグの助けになるかも知れません。

Q: クライアントアプリ (SPAのチャットアプリ) を開発している。現在、Amazon S3 への画像アップロードを Amazon API Gateway → AWS Lambda で行っているが、AWS Amplify を使ってクライアントから直接アップロードする方法を検討したい。

既に Amazon Cognito を使われていたため、認証済みクライアントに S3 への Put 権限を付与することが可能でした。また、ユーザーごとに読み込みできるファイルを分けたいとのことで、Amplify の File Access Levels で Private などの権限を指定する方法がマッチしそうでした [API Docs, Storage Developer Guide]。

Q: スマホアプリの Push 通知を検討している。Amazon SNS と Amazon Pinpoint はどちらが適しているか?

ディスカッションさせて頂いたところ、属性に応じた配信や配信の分割 (一度に push する数を指定) を制御したいとのことで、Amazon Pinpoint がマッチするとお伝えしました。

Q: Amazon S3 にバックアップする機能のある NAS を使っているがエラーが出た。メーカーに問い合わせたがよくわからないとのことだったので、一度見てほしい。

その製品でどのような制御をしているかによるので、あくまでも別途メーカーに確認してもらいたいことをお伝えした上で、該当のエラーを拝見したところ、サイズ超過エラーが出ているようでした。Amazon S3 の仕様としては1 回の PUT オペレーションで最大 5 GB、マルチパートアップロードの場合は最大 5TB まで Put できる点をお伝えし [FAQ, Docs]、NAS に関する仕様などの確認をお願いしました。

Q: AWS Glue に関する質問です。
1. repartition のときのキーはどうしたらいい?
2. repartition はスクリプトのどこで実行するといい?
3. AWS Glue で data processing units (DPUs) を増やしても分散しないんだけどなぜ?

  1. 例えば JOIN をするなら JOIN のキーと repartition のキーを合わせるというテクニックがあります。しかし色々なパターンのクエリがあるようなので、一旦キーを指定せずに repartition して試してみることを提案しました。
  2. DataFrame から temp Table を作っているようだったので、その前の DataFrame に df.repartition(100) のように入れることをご案内しました。
  3. クエリを打つ前に repartition して、 partition 数が executor 数より多い状態でもう一度試していただくようお願いしました (デフォルトで 1 executor あたり 4 task なので、 partition の数は executor の4倍以上にしたい)。

Q: AWS Lambda と Amazon RDS の相性の問題について教えてほしい。

AWS Lambda と Amazon RDS / Amazon Aurora を利用する際の考慮事項はこちらのスライドにまとまっております。

【旧版・説明欄参照ください】 サーバーレスアプリケーション向きの DB 設計ベストプラクティス

Q: AWS Amplify って何?

[Getting Started] を紹介しつつ、ざっくり概要をご説明しました。

Q: 会社で Amazon S3 バケットがパブリックになっていた問題があったため、セキュリティの確認をしたい。

Amazon S3 に関しては、Amazon S3 Block Public Access を試して頂きたいです [Blog, Docs]。それ以外だと AWS Config を使って変更を検知する、AWS Trusted Advisor を見てみる、Amazon GuardDuty を使うなどが考えられます。まずはどのような観点で確認したいか考えて頂くといいと思います。

Q: AWS に関するセキュリティの資料などあるか

[ホワイトペーパー (PDF)] や [無料のオンラインコース]、有料ではありますが [セキュリティーのトレーニング] もあります。

Q: Amazon EFS を本番で利用している。バーストクレジットバランスを見たら減っていた。プロビジョニングモードに切り替えるのがよいか?

既存のスループットを確認した上で切り替えを行うことをまずお勧めしました [Docs]。ユースケースを伺ったところアプリケーションの設定ファイル (テキストファイル) の参照がメインであり、更新頻度も一日に数回。更新から反映までのタイムラグも許容できるということで、Amazon EFS を使わず設定ファイルを各インスタンスに配布する方法も検討いただきたいとお伝えしました。

Q: AWS Fargate でアプリケーションを構築したいと考えているが、エンドユーザーがウイルス対策ソフトの導入を必須要件に掲げている。どのように説得すべきか。

アプリケーションアーキテクチャーに応じて具体的な脅威を想定した上で、ウイルス対策ソフトが必要なのか、他の手段で代替できないか、または必要に応じて追加の対策が必要でないかなど検討ください。機能ごとに想定される脅威を洗い出し、それぞれに個別の対策を考慮するのがよいとお伝えしました。
例えばファイルアップロードであれば、API Gateway → AWS Lambda → Amazon S3 という経路で一旦ファイルを格納し、AWS Lambda などでチェックする方法もあります。

Q: AWS Marketplace で Amazon マシンイメージ (AMI) を出品したいが、米国に口座が無いと登録できないように見える。日本法人はどのように販売しているのか?事例など無いのか?

WordPress の AMI を提供されている事例などがあります。米国に法人を設立して頂くことが一般的かと思われます。詳細はこちらの [窓口] からお問い合わせ下さい。

週刊 Ask An Expert まとめ、今回はここまで

最後までお読み頂きありがとうございます。
冒頭に書いたように、似たご質問をまとめたり、端的にまとめづらいご質問を省いているためそっくりこのままやり取りが行われているわけではありませんが、様々なご相談をいただいていることが伝わっていれば嬉しいです。実際の Ask An Expert カウンターでは、より詳細なご案内・議論が行われていますので、AWS を使っていてわからないことが出てきた際はお気軽にお越し下さい。
それではまた次回をお楽しみに!


このブログの著者

 

針原佳貴 (Yoshitaka Haribara)
スタートアップソリューションアーキテクト。好きなサービスは Amazon SageMaker, Amazon Rekognition, AWS DeepLens、趣味はドラム。