AWS Startup ブログ

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

はじめまして、Startup Solutions Architect の針原です。令和元年はじめの投稿を担当させて頂きます。ゴールデンウイークあけも前回に引き続き Ask An Expert の一週間を振り返り、AWS の知見を深めていきましょう!

Ask An Expert とは?

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

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


ある日のAsk An Expert(左:Solutions Architect荒木、右:Cloud Support Engineer福嶋)

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

週刊 Ask An Expert #4 – 2019/05/07 – 05/10

コンテナ と CI/CD

今週はコンテナと CI/CD に関する質問が多く寄せられたので、はじめにそれを見ていきましょう。

Q: Amazon Elastic Container Service (Amazon ECS) / Amazon Elastic Container Service for Kubernetes (Amazon EKS) / AWS Fargate の違いは何ですか?

ECS と EKS はコンテナオーケストレーションサービスおよび Kubernetes のマネージドサービスです。Fargate はその下で動くマネージドリソースを指します。すでにオンプレで Kubernetes が動いているのであれば、EKS がいいと思います。これから構築する場合は ECS をお薦めしています。Fargate は同時実行タスク数や CPU/Memory の上限などの仕様があるため、より柔軟な管理が必要な場合は EC2 type を使うなど検討するのがよいと思います。
参考:Docker on AWS: AWSのコンテナ関連サービスの選定例の紹介 – AWS ブログ

Q: EKS 利用時のセキュアなネットワーク構成はどのように設計しますか?

まずは一般的なネットワークの設定を行って下さい [docs]。その上で、EKS 利用時のネットワーキングに関する考慮事項を参照ください [docs]。

Q: EKS を利用して環境構築中です。kubectl get svc を実行したら error: the server doesn't have a resource type "svc" と表示されるのですが原因は何でしょう

EKS クラスターが作成されたら、クラスターを作成する AWS Identity and Access Management (IAM) エンティティ (ユーザーまたはロール) は、管理者 (system:master アクセス許可が付与されている) として Kubernetes Role-based access control (RBAC) 認証テーブルに追加されます。最初は、その IAM ユーザーだけが kubectl を使用して Kubernetes API サーバーを呼び出すことができます。お客様の状況を確認したところ、別 IAM ユーザーの AWS CLI において update-kubeconfig を実行されたようなので同じ IAM ユーザーとして試して頂きたい点をお伝えさせて頂きました [docs]。

Q: Kubernetes の Worker Node を AWS CloudFormation で作ったらスタックが作成がエラーになりました。

CloudFormation のイベント「状況の理由」を見ると原因が特定できる場合が多いです。今回は Amazon EC2 起動数の上限に達していたため、EC2 の制限画面 [console] を見て起動が許可されている数が多いインスタンスタイプを指定頂き解決しました。

Q: Worker Node が クラスターに参加しません。

Worker Node に SSH して user-data のログを見たところ /etc/eks/bootstrap.sh が存在しないというログが出ていました。確認すると CloudFormation で 指定する Amazon マシンイメージ (AMI) を EKS-optimized AMI ではなく、Amazon Linux AMI にしていたので上記bootstrapファイルがない状況でした。EKS-optimized AMI をご利用いただくようご案内しました。

Q: 定期的にコンテナを起動し処理を行いたいです。また、起動する各コンテナでは異なる処理を想定しています (DB の内容に応じて処理を変えるなど)。現在、ECS のスケジューリング機能 (Fargate) を使っていますが、他にどのような方法がありますか?

いくつか方法が考えられそうです:
1. ECS のスケジューリング機能を使いつつ、コンテナではシェルスクリプトなどを実行。初期処理を実行後、メインのプログラムに引数や環境変数で渡す。
2. CloudWatch Events から AWS Lambda を起動し、処理処理を実施後、RunTask API を呼び出す。
3. CloudWatch Events から Lambda を起動し、処理処理を実施後、AWS Batch の SubmitJob API によって Batch に処理をさせる (ただし Fargate は使えない)
4. CloudWatch Events から AWS Step Functions を呼び出し、初期処理を Lambda などで実行後、Fargate を呼び出す
…などなど

お客様には Step Functions の知見があったため、Step Functions の利用を検討されることになりました。

Q: ECS サービス制限「アカウント別のリージョンごとに、Fargate 起動タイプを使用するタスクの数」の意味は何ですか?

起動タイプを Fargate にした場合の、同時実行タスク数です。

Q: ECS にデプロイしても古いタスクがしばらく残ると思います。どこで制御できますか?

紐づく ALB の deregistration_delay.timeout_seconds を確認して下さい。

Q: ECS のログは何をどのタイミングで出せばいいですか?

アクセスログなのか、監査ログなのか、トラブルシューティング用のログなのかなど、ログの種類と要件によります。たとえば、外部通信をするような処理があれば、その前後でログを出しておけば Latency が高い場合の切り分けになります。

Q: Fargate で net.core.somaxconn を変更したい

現時点では Fargate では変更できないので、タスクを多く起動して頂くことで解決して下さい。

Q: ECS の環境を構築しており、GitLab を使っています。CI/CD はどうすれば実現できますか?

AWS CodePiepline 及び AWS CodeBuild などを使うことでコンテナの自動ビルド、ECR へのプッシュ、ECS サービスの更新などが可能です。ただし、CodePipeline は GitLab に対応していません。Git の移行は容易なので CodeCommit や GitHub へ移行することが可能ならご検討下さい。また、GitLab への Push をトリガーとして任意の処理ができるのであれば、S3 にコードを配置することや ECR へのプッシュまでやって CodePipeline のソースに ECR を指定する方法も可能です [blog]。

Q: Heroku で動かしている大量のマイクロサービスを AWS に引っ越したいです

1. CI/CD はどうしたらいいですか?
2. EC2 か ECS か EKS かどれを使えばいいでしょう?
3. EC2 のディスク容量を監視したいです
4. RDS (PostgreSQL) で拡張を使いたいのですが
5. MongoDB 互換の AWS サービスはありますか?

以下が回答です:
1. CodePipeline / CodeBuild / CodeDeploy をご検討下さい。
2. EC2 の事例が多いが、多くのマイクロサービスが EC2 に同居すると AMI 取得頻度が増えて辛そうなので、その点ではコンテナ (ECS/EKS) をお使い頂くといいのではないでしょうか。
3. CloudWatch エージェントを入れて、カスタムメトリクスに記録する方法はいかがでしょうか。
4. バージョンによって使える拡張機能が決まります。公式ドキュメントに一覧があるので、ご確認下さい [docs]。
5. Amazon DocumentDB があります。5/8に東京リージョンにもローンチしました [Announcement]。


ここからはもう少し一般的な質問です。

Q: SELECT DISTINCT が遅いような気がします。これまで開発環境 (SQLite on Cloud9) では問題なかったのですが、本番環境 (RDS MySQL) で遅くなったので原因を特定したいです。

一般的にはテーブル・クエリの内容に依存するので EXPLAIN を見ながら原因を特定します。その上で、

  • まず DB エンジンの問題であるかの切り分けを、MySQL on Cloud9 と比較して試してもらうよう提案しました。
  • クエリを拝見したところ、サブクエリで右側 (時系列データ) のテーブルを SELECT してから JOIN すれば速くなりそうなので試してもらうよう提案しました。
  • 時系列の大きいテーブルを読みに行っているようなので、最新のレコードだけ持つ小さいテーブルを用意し、検索時にはそちらを読むなどの改善案を提案しました。

Q: Amazon Rekognition で顔認証のアプリを作っています。Amazon S3 → AWS Lambda → Rekognition が期待通り動作しません。

S3 からのイベント通知で Lambda は動いているようでしたが、Lambda のログを確認したところ Python の構文エラーが発生していました。修正したところ動きました。

Q: S3 に画像を置かずにリアルタイムで画像認識させたい場合はどういう構成がよいでしょう?

クライアントから直接 Rekognition の API を呼ぶか、API Gateway + Lambda に 実行ロールを付与し、Rekognition API を呼び出すことができます。Rekognition の SearchFacesByImage API への入力には、S3 パスでなく Base64 エンコードされた画像データを渡すことができます。

ちなみに、僕が以前 Rekognition を使った顔認証受付サービスを作った時の [Article, Slides] を貼っておきます。

Q: EBSのスナップショットを5世代ぶんとると、料金は5倍になりますか?

いいえ。差分のサイズ分が課金されます。請求に関するご質問については、無料でカスタマーサポートにお問い合わせいただくことができます [docs]。

Q: Amazon EC2 Auto Scaling で ElasticIP アドレスを固定したいです (EC2 インスタンスに問題が発生した場合、別 AZ のインスタンスを起動したい)

ライフサイクルフックと Lambda などを組み合わせるとできるが大変。ドメインを名前解決して Elastic IP に到達しているとのことなので、インスタンスを 2 台用意し、Route 53 のヘルスチェックと DNS フェイルオーバーでの対応をする方法をご提案しました。
可能であれば、 ElasticIP を意識せずに済むように要件やシステムを調整し、ステートレスな構成にすることをご検討ください。

Q: AutoRecovery はどのような場合に発動するか

StatusCheckFailed によりトリガーされます [docs]。こちらにも回答があります [forum]。

Q: Amazon S3 Glacier の過去事例などありますか? (普段は使わない大量ファイルを保管しておきたいです。)

多くのお客様にご利用いただいています(たとえば、サービスのページに記載されている事例をご覧ください)。

Q: Amazon Cognito を利用するとき、隠蔽すべき情報は何ですか?

Cognito User Pool を利用するとき、認証後に払い出される情報である JWT (IDトークン、アクセストークン、リフレッシュトークン) は漏れないように注意してください。IDプールを利用する場合は、やはり Cognito から払い出される AWS Credentials (Access Key、Secret Access Key、Session Token) に注意してください。

Q: AWS Organizations で管理されたアカウントを、月の途中で組織から外したら料金の計算はどうなりますか?

請求に関する詳細については、カスタマーサポート へお問い合わせ頂くようご案内しました [docs]。

Q: Amazon CloudFront を使っており、独自ドメインを利用している。こちらを別アカウントの CloudFront に移行したいが、設定しようとするとCNAMEAlreadyExists エラーが出てしまいます。

以下を参考に TXT レコードを追加して、AWS 技術サポートへお問い合わせいただきたい旨をお伝えしました。

“CloudFront の「CNAMEAlreadyExists」エラーを解決する”
https://aws.amazon.com/jp/premiumsupport/knowledge-center/resolve-cnamealreadyexists-error/

Q: AWS Lambda から Amazon RDS への接続を考えているが、あまり相性が良くないというのも聞きます。Lambda はそれなりの起動数になることも想定されるがどうすればいいですか?

Lambda から RDS へ接続する場合、VPC に起動する必要があり、ENI 作成処理が発生した際のコールドスタートでは10秒程度かかることがあります。また、Lambda は並行して起動できるメリットがあるが、RDB には最大接続数の制限があります。それらの制約事項が許容できる・問題がない範囲であるなら、Lambda から RDS に接続しても大丈夫です。もし、RDS でなく Amazon DynamoDB でも要件を満たせるのであれば、 DynamoDB をデータストアとして利用できないか考えていただきたい。RDS を使いたい場合、一度 DynamoDB Stream を経由して RDS へ登録するなどのテクニックもご検討いただきたい。といったお話をさせていただきました。

参考: 【イチから理解するサーバーレスアプリ開発】 サーバーレスアプリケーション向きの DB 設計ベストプラクティス

Q: 最大10万件程度のクローリングを行いたい。可能限り並行してやりたいがどのような方法がありますか?

お客様は当初 Fargate を検討されていましたが、詳しくお伺いすると各処理は数秒程度で終わるとのことでした。処理が15分以下で終わるようであれば、Lambda の方が相性が良いかもしれないことなどを踏まえ議論しました。一度 SQS に登録して Lambda を起動する方法をご検討されるとのことでした。

Q: スマホアプリの開発を行っています。Push 通知を行うと急激にアクセスが増えて、サービスがダウンすることがあったどうすればよいでしょう?

以下の観点で確認すると良さそうです。

Push 通知送信:
一度に多くのユーザーに Push せず、Push 通知の数を抑制する (1分ごとに100人ずつなど) Pinpoint であればこれが可能です。

バックエンド:

  • CloudFront を使ってキャシュすることで Origin の負荷を下げる。
  • 予めリクエストが増えることが分かっているのであれば push 前に予め多めのインスタンスを起動する。

以下の資料が参考になりそうです:
[AWS Start-up ゼミ / DevDay 編] よくある課題を一気に解説! 御社の技術レベルがアップする 2018 秋期講習 – 一斉プッシュ通知送信後にサーバの負荷上がる問題

Q: 費用を抑えたいのですが、どうすれば良いでしょうか?

料金の割合をお聞きしたところ RDS にかなりの割合が掛かっていた為、以下のような対策を論じました。

  • 開発環境の DB インスタンスタイプを通常は下げて、負荷試験の時のみ本番と同じにする。
  • RDS は停止が出来るので、深夜や土日の開発環境は停止する。
  • 本番環境の RDS についても負荷状況をみつつ、予め負荷試験を行って問題なければタイプが下げれないかなども検討する。

Q: Lambda の同時実行数の考え方を知りたいです。

以下を見ていただきながら概要をお伝えしました:
https://www.slideshare.net/AmazonWebServicesJapan/20190402-aws-black-belt-online-seminar-lets-dive-deep-into-aws-lambda-part1-part2#55

Q: Rekoginiton の API を呼び出し、S3 に結果情報を Put するだけの処理をする Lambda に時間が掛かっています。どうすれば高速化できますか。

まずは Lambda のコードにトレース用のデバッグログを追加したり、AWS X-Ray で可視化を行い、どの処理で時間がかかっているかをご確認ください。該当箇所が特定できてから、有効な対応方法を検討します。

Q: Amazon CloudFront で、ちゃんとキャッシュが効いているか確認したいです。

CloudFront のキャッシュ統計レポート [docs] で Percentage of Viewer Requests by Result Type - Miss が多いこと、および実際の CloudFront からのレスポンスヘッダに X-Cache:Miss from CloudFront があることから、キャッシュが効いていないように見受けられました。Object Caching の設定が Use Origin Cache Header になっていながら特に Origin からのレスポンスではヘッダーを意識されていなかったため、対案として Customize TTL にして、希望の TTL を設定することをご検討いただきました。

Q: Amazon GuardDuty と WAF を連携し、WAF 運用の自動化をしたいです。

aws.amazon.com/solutions から、要件に合うものがないか見ていただくようにお願いしました。また、APN テクノロジーパートナーの製品も併せてご紹介しました [WAF ソフトウェアを提供するAPN テクノロジーパートナー, WafCharm 等]。

Q: Amazon CloudFront で起動してない Amazon EC2 インスタンスを、後から CloudFormation でコントロールできるようにしたいです。

残念ながらできません。

Q: SPA (Single Page Application) と Not SPA はどちらがいいですか?

SPA は、画面一枚でクライアント側で JavaScript で画面描画して、通信内容は JSON などになります。Not SPA は、サーバ側で画面描画 (HTML) して、通信内容はまずは HTML。SPA の方がクライアントで処理させられる分、サーバの負荷、通信量、コストを抑えられるなどの違いがありますが、どちらがいいかは要件次第です。


週刊 Ask An Expert まとめ、第4回目はここまで

読んで頂きありがとうございました。似た質問をまとめたり、端的にまとめづらい質問を省いたりしているためそっくりこのままやり取りが行われたわけではありませんが、このように様々なご相談を頂いてます。自分も相談したいかも?と思って頂けたら、実際に Ask An Expert カウンターまでお越し下さい。

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

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


先日開催した 月刊 Ask An Expert #01 では、会場からのご質問などもいただきながら、複数の SA からより詳細に解説を加えるなど充実した会となりました。ぜひこちらから #02 の参加登録をして、さらに知見を広げて&深めていきましょう!

このブログの著者

 

針原佳貴 (Yoshitaka Haribara)

スタートアップソリューションアーキテクト、好きなサービスは Amazon SageMaker、趣味はドラムです。