AWS Startup ブログ

【週刊 Ask An Expert #05】AWS Loft Tokyo で受けた質問まとめ #AWSLoft

皆さんいかがお過ごしでしょうか、Amazon Web Services Japan の Startup Solutions Architect、塚田です。週刊 Ask An Expert も五回目となりました!この記事、ちゃんと皆さんの参考になっているでしょうか??何かご意見やご感想があったら、ぜひフィードバックください。ハッシュタグ #AWSLoft でつぶやいていただければ私達に届きます。

さて、この記事では一緒に Ask An Expert の先週を振り返り、私達 AWS のエンジニアと知見を共有しましょう!今回もかなり多様な内容がたくさん寄せられました。

Ask An Expert?

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

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

ある日のある Expert(Container Specialist SA 原 @toricls) @ Ask An Expert

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

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

では今回は、 2019/05/13〜05/17 分のまとめです。どうぞ!

週刊 Ask An Expert #5 – 2019/05/13〜05/17

Q: Amazon RDS MySQL にあるデータを随時 Amazon S3 に差分エクスポートしていき、Amazon Athena で分析したい。RDS にある既存データは10億レコード。

あくまでも RDS にあるデータを元にする必要があるなら、例えば AWS Database Migration Service を使って、ソースに RDS を、ターゲットに S3 を指定し、CSV または Parquet でデータを移し続けるのはどうでしょうか。または、ターゲットには Amazon Kinesis Data Streams を指定することもでき、より柔軟な処理を行うことも可能です。

また RDS にあるデータを度外視して言うと、分析に必要なデータはアプリケーションから Amazon Kinesis Data Streams や Amazon Kinesis Data Firehose にストリームで流すことで Amazon S3 に分析用データを流すことができ、分析対象にすることもできます。[参考資料:御社の技術レベルがアップする 2019 春期講習 3. ログをちゃんと扱いたい]

Q: Amaozn S3 への画像アップロードをトリガーとして AWS Lambda を走らせている。言語は Python。望んだ処理(S3 から元画像を取得し、加工してS3に書き戻す処理)は行われているようだが、毎回必ず Lambda が複数回キックされる。どうすれば?

AWS Lambda は仕様として At Least Once (最低一回起動される)ではありますが、毎回なのは何かおかしいですね…。
→ Lambda の実行ログを見てみると、 Lambda Handler の返り値として S3.Client.put_object() の返り値をそのまま return しているため、Python の Runtime から Unable to marshal error が出て異常終了していました(S3.Client.put_object() によるアップロード処理自体は済んでいたため、その関数内で望んだ処理は全て行われていたが Lambda 関数としては異常終了していた)。S3 トリガーの場合 Lambda Handler からの返り値は特に意味を成さないため、返り値を変更して解決、正しく一回しか処理されないようになりました。

Q: AWS Lambda の処理時間が、UI 上は1秒ほどでレスポンスが返ってきているように感じるのに、処理終了のログが出力されるまでには20秒ほどかかっているように見える。なぜか?

詳細を確認すると、Lambda 関数はほぼ1秒以内に処理が完了しており、その関数で出力されたログが Amazon CloudWatch Logs のマネジメントコンソール上で表示されるまでに 20秒ほどかかることがある、という状況でした。

Lambda 関数から出力されたログは速やかに CloudWatch Logs (および設定している場合は AWS Lambda、Amazon Kinesis Data Streams、Amazon Kinesis Data Firehose といったサブスクリプション)に伝わっていることと、そのログが CloudWatch Logs のマネジメントコンソール上(または GetLogEvents/FilterLogEvents API)で参照できるまでに少しタイムラグがある場合があるが ログ出力元の Lambda 関数の実行時間が長引いているわけではないことをご案内しました。

Q: オンプレミスでData warehouse (Teradata) を運用しているが、それを Amazon Redshift および Amazon RDS へ移行したい。BI ツールとして Tableauを使用している。

Database Migration Service の Schema Conversion Tool (SCT) 、または AWS Glue を利用する案をご案内しました。例えば、ホットデータを Redshift に、コールドデータを S3 において Redshift Spectrum または Amazon Athena でクエリする、といったアイデアがあり得ます。文字コードの変換等は Glue Python Shell を使って対応する方法、BI ツールの他の選択肢として Amazon QuickSight をご案内しました。

Q: オレゴンの VPC 内にある Amazon EC2 インスタンスに、 VPN 経由で接続している。そこから NAT-GW 経由で東京リージョンの Re:dash(on EC2)にアクセスしようとしているがアクセスできない。Re:dash インスタンスの Security Group では、 NAT-GW にアタッチしている EIP のみアクセスを許可している。

ネットワーク周りの設定の見直しと、一時的に切り分けのために Re:dash側インスタンスの Security Group Inbound rule を解放した上でアクセスできるか、できないならアクセスログなどでちゃんと NAT-GW にアタッチされた EIP からのアクセスになっているかなど、切り分け手順について議論しました。

Q: BYOIP(IPアドレスの持ち込み)が可能なリージョンはどこですか?

この機能は現在、米国東部 (バージニア)、米国東部 (オハイオ)、米国西部 (オレゴン)、欧州 (ダブリン)、欧州 (ロンドン)、欧州 (フランクフルト)、カナダ (中部) の各 AWS リージョンでご利用いただけます。[FAQ]

Q: Amazon LightSail と Amazon EC2 のどちらを利用したほうがいいですか?

VPS である Lightsail はとても簡単に使い始め、管理することができます。EC2 は、より柔軟でスケーラブルに構成することができます。要件に合う方をお使いください。
参考:[AWS Black Belt Online Seminar – Amazon Lightsail – Lightsail の使い所、EC2 との使い分け]

Q: 自社サービスで利用している証明書がの期限が切れてしまったため、Amazon Certificate Manager(ACM)に移行したが、サービスにテストアクセスすると正常にレスポンスが返ってこない。

一緒に確認したところ、もともと EC2 に証明書をインストールして直接アクセスされていたところ、ACM への移行にあたって Elastic Load Balancing(ELB) を導入されていたが、テストでは引き続き EC2 に直接アクセスしようとしていた。ELB 経由でアクセスしたところ、正常に動作した。

Q: WordPress を運用したいが、どうすればいい?

EC2 もしくは Lightsail をご検討頂けると良いかと思います。詳細な要件などがないのであれば、まずは Lightsail が簡単そうということで、以下をご紹介しました。

Q: AWS Cloud9 上で Serverless Framework を使って開発をしている(Amazon API Gateway, AWS Lambda, Amazon DynamoDB を利用)。開発中、頻繁なデバッグのために都度デプロイするのに時間がかかって辛い。

要件をお聞きした所 AWS SAM の aws-sam-cli がマッチしそうだったので解説し、ご検討いただきました。

Q: Private SubentとPublic Subnet に、それぞれ EC2 インスタンスを立てている。手元のラップトップから、Private Subnet の EC2 に SSH でアクセスできない。

Private Subnet の EC2 インスタンスに直接アクセスすることはできないと思われるため、AWS Systems Manager(SSM)Session Manager 機能を紹介し、利用を検討いただくようお願いしました。

Q: サーバーに httpd を入れてみたが、ブラウザから /var/www/html/index.html にアクセスできない。

一緒に確認した所、httpd.conf 内の DocumentRoot の先頭に / が入っておらず、指定したパスが違っていました。

Q: AWS CloudFormation、AWS OpsWorks、Amazon Simple Workflow Service (SWF) について教えて欲しい。

いろいろと違いがありますが、例えば AWS CloudFormation はリソースを YAML/JSON で定義し、Infrastructure as Code を実行するものです。OpsWorks は、サーバーを Chef でプロビジョニングできます。SWF は、ワークフローを定義するものです。SWF と同じくワークフローを定義・管理するサービスとして、現在では AWS Step Functions も出ています。使い分けについては AWS Step Functions のよくある質問 をご参照ください。

Q: Application Load Balancer(ALB) と AutoScaling Group(ASG) を連携させています。ASG 内の EC2 インスタンスは全て同じ Amazon Machine Image(AMI) を使っているのに、約半数が Health Check に失敗してしまいます。

確かに、半数程度のインスタンスが HTTP Health Check に通らず Scale-in されてしまう状態でした。Health Check 失敗の直接原因はタイムアウトの模様。該当のアクセスログを見るなど、なぜタイムアウトしてしまっているのかの切り分けをお願いしました。

Q: (続き)Health Check のアクセスログを見てみたが、200 OK しか見当たらない。

アクセスログのみでなくエラーログも一緒に見てみましたが、気になるログはありませんでした。
出力されるログについては Web サーバーのロギング設定、Permission 等々に様々な要因が絡むので即時回答が難しい状況でした。
ご相談いただいた時刻が 17:50 頃であり時間が取れず、その場では詳細な確認も難しいので、確認した内容を AWS サポートにご連絡頂きたい点をお伝えさせて頂きました。

Q: AWS Amplify を使って、新しい動画配信サービス(モバイルアプリ)を個人で作ろうと思っている。動画配信者は、アプリを通じて動画をアップロードできる。閲覧者は、自分が気になる動画を見る。フリーミアムモデルで、無料会員は閲覧できる動画が制限される。その他、✕✕✕✕な新規性あるアイデアを考えている(秘密なのでここでは伏せときますmm)。など。

全面的に、ホワイトボードを使って実現方法をディスカッションしました。サービスローンチが楽しみですね!

Q: WebRTC システムを構築中。STUN/TURN サーバとして、EC2 インスタンスに coTurn を入れたが、クライアント(turnutils_uclient)から通信できない。

確認したところ coTurn プロセスが起動していなかったため、試行錯誤の上で OS reboot したら起動しましたが、まだ通信できませんでした。Security Group で通信を塞いでいそうだったため、切り分けのため一時的に全ての Inbound を許可したところ通信できました。使用するポートは 3478 とのことだったので、あとは TCP か UDP か、適切なプロトコルを指定して許可していただくようご案内しました。
また、Security Groupで SSH を全開にしていたので、IP(CIDR) のレンジを絞るなどをセキュリティを強化することをお勧めしました。

Q: Amazon API Gateway の AWS Service Proxy を通じて、 Amazon Rekognition の searchFacesByImage API を呼びたいがうまくいかない。

AWS CLI を使って Rekognition API の呼び出し方や調査の方法、実行ログを使ってのデバッグ方法などをご案内しました。
一緒に作業を進めた結果、目的通り Rekognition の searchFacesByImage API を呼ぶことができました。
また、API Gateway の統合レスポンスで、 Rekognition API からのレスポンスをクライアントに必要な形に整形できることも併せてご案内しました。

Q: IAM Role の権限を最小限にするためによい方法はないか。

不要と思われるポリシーをデタッチしながら、AWS CloudTrail を利用して必要な Action を確認すること、AWS IAM のアクセスアドバイザーを利用して使われていないポリシーを定期的に見直すことなどをご案内しました。

Q: Amazon CloudFormation のスタックをデプロイする際、実行時の IAM ユーザーに権限が必要になってしまい困る。IAM ユーザーに、デプロイに必要な全ての権限をつけておかなければならないのか?

CloudFormation には、スタック内のリソースにアクセスする際に適用されるサービスロールを指定することができます。[docs]

Q: AWS AppSync のリゾルバーをテストしたい。

現時点では、リゾルバーのロジックに対してローカル環境などでユニットテストすることはできませんが、マネジメントコンソール上ではモックデータを設定した入出力テストを実行することができます。[docs]
また、自動化・品質保証の観点からは、リゾルバーのみでなく End to end で自動化されたテストなどの実施をおすすめします。

Q: Amazon SageMaker で、deploy() 時にエンドポイント名を指定したい。リファレンスには渡せそうなパラメータがあるが、指定の仕方がわからない。

お話を伺ったところ、SageMaker SDK に生えているEstimator.deploy() メソッドのパラメータの話のようでした。Python のキーワード引数の形式で指定すればよいことをご案内しました( .deploy(..., endpoint_name=Foo, ...) )。

Q: オンプレミス環境から Amazon RDS に接続したい場合は、RDS を public accessible にしなければならないか。

RDS を public にすることでも実現可能ではあるが、セキュリティの観点から AWS Direct Connect や VPN 等を使いオンプレミス環境と VPC をプライベートに接続することをおすすめしました。その際、接続の安定性やレイテンシなどの懸念点があることを併せてご案内しました。

Q: Amazon API Gateway – AWS Lambda (Golang) なサーバーレス構成のシステム。ローカルで Golang プログラムを開発しているときは 400 ms くらいで実行が完了していたが、AWS 上にデプロイして自宅からインターネット経由でアクセスしてみたら 900 ms ほどかかってしまう。パフォーマンスを上げるにはどうすれば?

どこでどれだけ時間がかかっているのかをまず計測してみてください。ご自宅からAPI Gatewayまでの間、Lambda の起動、Lambda 内で実装されたそれぞれの処理など。それによって、例えば Lambda の起動時間をチューニングするにはパッケージサイズを削ったり、Lambda 自体の処理速度を上げるには Lambda のスペック(メモリサイズ)を調整したり、といった対応が考えられます。
※ AWS Lambda では、構成されているメモリの量に比例して CPU パワーが直線的に割り当てられます [docs]。

Q: ユーザー ID とそれに紐付いた情報を永続化し、AWS Lambda からアクセスしたい。シンプルにユーザー ID で情報を引き当て、更新できればよい。どういう手段がある?

Amazon DynamoDB を Key Value Store 的に使う方法を提案しました。

Q: Amazon API Gateway と AWS Lambda で構築した API サービスを開発者向けに公開しようとしている。利用者ごとに、処理データ量、処理時間を計測して、その量に応じて課金したい。どういうアーキテクチャがありうるか?利用者には最新の課金状況を確認できるダッシュボードを提供する。月次でユーザーごとに課金額を集計し、請求する。

基本的には Lambda 内で課金額の計算に必要な情報を出力し、参照要件に適したデータストア・ストレージに保存する方向性で議論しました。例として、Lambda からは Amazon Kinesis Data Streams にデータを流し、別の Lambda でそのデータを取得できるよう Event Source Mapping を設定します。取得したデータから最新の課金状況を計算して DynamoDB を Update し、月次の集計に必要な情報はやはり Lambda かまたは Amazon Kinesis Data Firehose を経由して Amazon S3 に流し、 Amazon Athena でユーザー ID ごとにグルーピングして Sum を出すような方法をご案内しました。

ディスカッションに使った Ask An Expert ブース近くのホワイトボード

また、処理データ量や時間を測るものではありませんが、API Gateway には API Key を使って利用者ごとにスロットリングやクォータの制限を設定できる使用量プラン機能があるので、関連する情報として併せてご紹介しました [docs]。

Q: AWS アカウント、IAM User の管理方法についてベストプラクティスを知りたい。今、全てのリソースが 1 AWS アカウント内に置いてある。

規模と要件にもよりますが、開発環境と本番環境は別アカウントにすることでセキュリティ、請求情報の分離などの面で向上が望めることをご紹介しました。その際、アカウント間の認証・アクセス管理は IAM User とスイッチロール機能を使って一元化する方法や、支払いは一括請求機能を使って支払い用アカウントに集約できることなどをお話しました。また、それらを含む複数アカウントの管理には AWS Organizations をお使いいただけることをご紹介しました。

Q: Amazon EC2上のアプリケーションで環境変数を扱うベストプラクティスを知りたい。

環境変数として扱いたい情報を AWS Systems Manager の Parameter Store [docs] に入れておき、EC2 起動後に Parameter Store から情報を取得、環境変数に展開する方法をご案内しました。

Q: IoT のデバイスセキュリティについて知りたい。

AWS IoT Device Defender などをご紹介しつつ、議論しました。[article]

Q: AWS IoT GreenGrass は、IoT デバイスが AWS IoT サービスと通信する際のハブのようなものだと思っているが、合っているか?

基本的にご認識のとおりでした。詳しくはドキュメントを御覧ください。[docs]

Q: IoT デバイスから送信されたメッセージを最終的に Amazon Athena で分析したい。どのような構成がよいか。

まずは Amazon S3 にデータを配置することを目指します。Amazon Kinesis Data Firehose で 変換しつつ S3 に配置する方法、S3 に直接書き込んで、定期的に Glue などでカラムナ―フォーマットに変換する方法などが考えられます。

Q: APN(AWS Partner Network) のセレクトコンサルティングパートナーになるには、どういう条件を満たせばよいか?

APN パートナーとしての変遷を解説しているページ[Link]を一緒に見ながらご案内しました。

Q: IoT のセンサーデータを可視化するBI ツールの開発を行っている。現状は検証のため、 screen コマンドで python Web サーバーを実行し、ユーザーにアクセスさせている状態。バックエンドには Tableau をつかっているが、今後は Tableau だけでなく独自の Python プログラムもバックエンドで使用する想定。データストアにはどのようなサービスを使うのがよいか。Amazon Redshift や Amazon Athena などを考えている。

Redshift + Athena か、Redshift + Redshift Spectrum ではどうでしょうか。ワークロードに合わせて複数のデータストアを想定しておくことなどを踏まえて議論しました。

Q: (続き)フロントエンド、バックエンドサービスにはどのようなサービスを使うのがよいか。

シンプルな Web API なら Amazon API Gateway + AWS Lambda で、処理時間が長い同期処理などはコンテナ上に展開したアプリケーションで実行するのはいかがでしょうか。フロントエンドの静的コンテンツは、Amazon CloudFront + Amazon S3 や、 Amplify Console で提供することが可能です。認証も取り入れたいとのことですので、AWS Amplify + Amazon Cognito などもご検討いただくようご案内しました。

Q: Amazon DynamoDB を利用中。テーブルをたくさん作ってしまっているが、使い方として正しいのか。

公式ドキュメントのベストプラクティスに記載のある通り、可能な少ないテーブル数に収まるよう設計すべきであることをご案内しました。DynamoDB のテーブル設計方法を解説する資料も一緒にご案内しました。

Q: Amazon Aurora MySQL の Freeable Memory が 1 日に何度か 0 になってしまう。

どのクエリが memory を使ってしまっているのかを特定する必要があるため、該当時間帯に show processlist などで実行中のクエリなどを特定するようにお願い。
また、お話を伺うと定期的に重そうなバッチ処理が走っていそうだったため、バッチ処理側の DB アクセス部分に問題がないかなども併せてご確認いただくようご案内しました。

Q: AWS CloudFormation で DynamoDB を管理している。オペミスによるスタック更新などで DynamoDB リソースが謝って削除されないように保護したい。

CloudFormation のサービスロールに DynamoDB の削除権限をつけない方法、バックアップ&リストア機能を活用する方法などをご案内しました。また、更新対象リソースの更新動作[docs]が「置換」でないことを確認しておく、Update Stack 実行前に Change Set を作成し Table の再作成などが走らないことを確認する。などの関連事項が考えられる他、CloudFormation で管理するものは Immutable なコンポーネントのみにして、データベースなどのステートフルなリソースは対象としないなどの対応方針もあり得るかと思います。

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

いかがでしたか?

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

関連するおすすめイベントのお知らせ

来る 5/27(月)19:00〜、AWS Loft Tokyo にて
【知見】 月刊 Ask An Expert!AWS Loft でエキスパートが受けた質問まとめ #02
を開催します!

このブログ記事ではざっくりでしたが、こちらのイベントではもう少し解説を加えながら、且つ会場からのご質問なども受けながら Ask An Expert の知見を共有していきたいと考えています。ぜひこちらから参加登録をしてください

では、来週もこのブログにて週刊 Ask An Expert #06 をお届けします。ブログでもイベントでも、またお会いしましょう!

このブログの著者

塚田 朗弘(Akihiro Tsukada)@akitsukada

Serverless, Mobile, Blockchain, FinTech Security あたりをよく触っているスタートアップ ソリューションアーキテクトです。
最近のヒット作は 【イチから理解するサーバーレスアプリ開発】 サーバーレスアプリケーション向きの DB 設計ベストプラクティス です。