AWS Startup ブログ

【週刊 Ask An Expert #07】チャットサービスに適した DB は?AWS Loft Tokyo で受けた質問まとめ #AWSLoft

皆さんこんにちは。ザビオです。

この記事は、週刊 Ask An Expert 7 回目です。最近蒸し暑い日が続いていますが体調崩さないようにお気をつけください。
「参考になった!」「いい内容だ!」と思っていただけたら、ぜひハッシュタグ #AWSLoft を付けて拡散して頂ければと思います。もちろん、改善点・要望もお待ちしております。

Ask An Expert?

さて、皆さん AWS Loft Tokyo はご存知でしょうか?

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

ある日の Ask An Expert (Solutions Architect 塚越)

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

※ 似たご質問をまとめたり、ざっくりまとめにくいご質問を省いたりしているため、実際のご質問件数、内容とは異なる部分があります。

週刊 Ask An Expert #7 – 2019/05/27〜05/31

Q: 自社で使用している Bitbucket を AWS CodeCommit にバックアップするスクリプトが最近動作していない。どういう事が考えられるか。AWS Lambda から Amazon EC2 を起動し、その EC2 内でスクリプトを実行している。

スクリプトを実行して、原因の判るエラーが返ってきていないのであれば、スクリプトの内容(git コマンド)を1行ずつ動かして、どこでエラーになっているのかを確認していきましょう。

また、定期タスクのために都度 EC2 を動作させるのではなく、よりマネージドに Lambda か AWS Fargate で実行する方法を検討してはいかがでしょうか。その際は、Lambda や Fargate が扱えるストレージ容量にご注意ください。

Q: サーバーレスアプリケーションで RDB を検索して JSON を返すような API は作れるか

原理的には可能ですが、いくつか考慮すべき点があります。

Lambda を RDB への OLTP な処理で使うと同時接続数の問題で Max Connection など DB 側のリソース制限にかかってしまう恐れと、VPC 内にある RDB に接続する際に Lambda が ENI を作成する時間を要する可能性があるため、アクセス頻度等の条件によりますが適さないことがあります。

その場合は、サーバーレスでなく EC2 や Amazon ECS, AWS Fargate などをご検討ください。

または、Amazon Aurora Serverless MySQL 5.6 をお使いの場合、5/30 にサポートされた Data APIを使うことで、AWS AppSync、AWS Lambda から Aurora にアクセスすることも可能です。

Q: (続き)DB に対して大量に検索するとき、何を考慮すればよいか。

RDBMS であれば、explain などを叩いて、インデックスが効いているかなど通常の RDBMS のチューニングを行います。
また、負荷分散手段として Read Replica を作って読み込みを分散する方法、Elasicache などを使用してクエリ結果を cache する方法などをおすすめしました。

Q: AWS Fargate のタスクがヘルスチェックに通らない。

確認したところ、タスク定義やセキュリティグループの設定に問題は無さそうでした。切り分けとして、同じ Amazon VPC 内に EC2 を立ち上げて、そこからヘルスチェックパスに curl コマンドを実行すると 404 Not Found が返ってきました。まずヘルスチェックエンドポイントから 200 OK が返るように、ミドルウェアやアプリケーションのログなどを確認しつつ、修正してもらうようにご案内しました。

Q: Amazon Redshift のデータを定期的に unload して Amazon S3 に置きたい。

Amazon EC2 インスタンスで cron daemon を使用して定期的に unload を実行する方法や、AWS Glue で定期的にRedshiftのデータをloadしS3にファイルを吐く、Amazon CloudWatch Events で Amazon ECS や AWS Lambda の実行をスケジューリングする方法などを紹介しました。

Q: 外部のレンタルサーバーで WordPress を運用している。負荷対策のために AWS サービスを活用したい。

Amazon CloudFront + S3 で WordPress の静的コンテンツを配信するのが一般的な対策といえます。StaticPress などで WordPress のコンテンツを S3 にエクスポートし、CloudFront で配信する方法や、WordPress プラグインを使って画像ファイルのみ S3 に配置し負荷をオフロードする方法などが考えられます。
モバイル端末/PC などアクセス元のデバイスに応じて返却するコンテンツが変化するようなケースでは、CloudFront でデバイスタイプに応じたキャッシュの制御が必要になるためそちらをご案内しました。

Q: Amazon API Gateway + AWS Lambda + Amazon S3 のサーバーレスシステムを運用している。外部の IdP と連携して SAML の認証をしたい。

ALB 配下の Amazon EC2 インスタンスから API Gateway を呼び出す構成であったため、API Gateway ではなく前段の ALB の認証連携機能を有効化することをご紹介しました。

Q: IoT デバイスからセンシングデータを外部サービスに転送している。最終的にセンシングデータを活用して天気予報を提供するサービスを作りたい。どのような構成を取ればよいか。

Amazon S3 にデータを格納することをまずは目指していただき、各種AWSサービスで解析/分析できることを紹介しました。
下記資料38ページ、「ログをちゃんと扱いたい」をご覧ください。

こちらの Black Belt Online Seminar 資料も参考になるかと思います。

Q: Amazon Pinpoint をエンドユーザーに提案したいと考えている。
1) 通知配信時の送信レートを制御することは可能ですか?

通知配信の送信速度を指定可能です(モバイルプッシュの場合 50〜25,000/秒)。プロジェクト全体でデフォルト速度を指定することと、キャンペーン単位で設定をオーバーライドすることが可能です。

2) API で静的セグメントを作成することはできるか?

Amazon S3 に JSON または CSV で配信先リストをアップロードし、CreateImportJob または CreateSegment API でインポートすることでセグメントを作成できます。

また、6/17 (月) に AWS Loft Tokyo にて、Pinpointを活用してカスタマーエンゲージメントを高める方法についての勉強会を行いますので、興味ある方は奮ってご参加ください!参加登録は ↓ こちらから。

Q: Amazon EC2 インスタンス上の Web サーバーにファイルアップロードすると、20秒ぐらいで接続が切れる。ロードバランサーは使っていない。クライアントのネットワークキャプチャからはTCP out-of-order が発生していることは確認している。クライアント環境は PC からでもタブレットからでも発生。OS や httpd/nginx を変えても再現する。

まずは EC2 側で tcpdump などでネットワークキャプチャして問題がないか確認していただき、EC2 側で特に問題が発生していないようであれば AWS サポートにお問い合わせいただくようご案内しました。

Q: Amazon ECS + AWS CodeDeploy による Blue/Green デプロイがうまくいかない。

CloudWatch Logs に出力されていたログを確認したところ、Task defenition で指定している Role が意図せず変更されていました。Role を正しいものに修正いただき、問題が解消しました。

Q: チャットアプリにおいてアップロードされた画像を、公開範囲を限定して配信したい。

Amazon CloudFront の署名付き URL を使用する方法をご紹介しました。

Q: Amazon S3 に配置したオブジェクトを一定期間過ぎたら削除したい。

Amazon S3 のバケットにライフサイクルを設定することで、作成後、一定期間経過したオブジェクトを自動的に削除することが可能です。

Q: Amazon DynamoDB Streams から AWS Lambda で取得したデータを元に再度 DynamoDB に書き込みを行った場合、無限ループになりうるか。

はい。

Q: Amazon RDS から Amazon DynamoDB へデータを移行するにはどうすればよいか。

AWS Database Migration Service のターゲットに Amazon DynamoDB を指定する方法、変換したデータを S3 にアップロードして AWS Data Pipeline でロードする方法、容量が大きくなければ AWS SDK を使ったバッチ処理でデータ変換しながら流し入れる方法などがあります(既存のデータ容量は 1GB 未満でした)。

移行後は件数などが想定通りになっているかを確認すると共に、移行リハーサルなどを実施しアプリ側でもデータ整合性を確認することをおすすめしました。

Q: 現在チャットのサービスを作っている。アプリケーションは Amazon EC2 上に実装し、データベースには Amazon RDS を使っている。1日に2-3万メッセージを処理しているが、RDB でよいのか悩んでいる。Amazon Elasticsearch も検討している。

DB への Read/Write 頻度やアクセスパターンによって最適なデータストアを選んでいただく必要があります。Chat サービスの場合、例えばピークタイムなどに Write が集中すると、 RDB ではさばききれなくなることがあるかも知れません。その場合は、スループットをスケールさせやすい Amazon DynamoDB が使いやすいでしょう。

下記資料の9ページ、「データストア どれを使えばいいのかわからない」もご参照ください。

Q: 複数の AWS アカウントをどう管理すればよいか。現在複数のアカウントを持っており、そのうち 1 アカウントを親アカウントとして利用している状況。

まずは本番環境と開発環境といった単位でアカウントを分ける考え方を提示しました。それによって、リソースへのアクセス権限を明確に分離してセキュリティを向上したり、各種 AWS リソースの上限値等がそれぞれのアカウントごとに分かれて事故を防ぐ効果が望めます。その他、システムやサービス、プロジェクトごとにアカウントを分けるケースもあります。また、親アカウントは権限が強力であるため、基本的に何もリソースを置かないようご案内しました。

Q: AWS Loft には AWS アカウントのルートユーザーじゃないと入れないの?

いいえ。普段 IAM ユーザーをお使いの方でも大丈夫です。有効な AWS アカウントをお持ちのスタートアップやデベロッパーの方は大歓迎ですとお伝えしました!
※ 「AWS Loft Tokyo のご利用にあたって」もご確認ください。

Q: オンプレミスサーバー/他のレンタルサーバーを AWS に移行する際、どのようなサービスが使えるか。

VM ImportAWS Server Migration ServiceCloudEndure 等をご紹介しました。

Q: 趣味で EC サイトを開発している。AWS Apmlify + AppSyncを使って開発を進めているのだが、Amazon DynamoDB のモデリングのやり方に悩んでいる。RDBMSの感覚が抜けないというか、しみついている。

以下の資料をベースに、考え方を解説。Step By Step でやってみることをおすすめしました。

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

いかがでしたか?

冒頭に書いたように、似たご質問をまとめたり、ざっくりまとめにくいご質問を省いたりしているためそっくりこのままやり取りが行われているわけではありませんが、様々なご相談をいただいていることをお伝えできれば嬉しいです。実際の Ask An Expert カウンターでは、もちろんより詳細なご案内、議論が行われています。

また次回をお楽しみに!

このブログの著者

中武 優樹(Yuki Nakatake)
Blockchain、Database、Zabbix が好きなスタートアップ ソリューションアーキテクトです。