JAWS-UGコンテナ支部#9 での発表資料です。 ECSを本番サービスで利用するにあたり工夫したポイント、ハマったポイントを発表しました。
乗換NAVITIMEのバックエンドをオンプレからECSに移⾏した時の話JAWS-UG コンテナ⽀部 #9
View Slide
⾃⼰紹介• 渡部茂久(わたべしげひさ)• 株式会社ナビタイムジャパン• サーバーサイドエンジニア• 好きなAWSサービス• Amazon ECS , CloudFormation
About NAVITIME JAPAN• ドアtoドアのトータルナビを提供するrgb(0,100,0)の会社• AWSの利⽤は2014年ごろから• 2017年3⽉に乗換NAVITIMEサービスのバックエンドをECSに移⾏• AWS Summit Tokyo 2017で事例紹介 http://bit.ly/2t5LE4D
今⽇の内容• AWS Summit Tokyo 2017では発表できなかった ECS移⾏にあたり⼯夫した、ハマったポイントを共有させていただきます• これからECSを本番利⽤しようとしている⽅のためになれば幸いです
AWS Summit Tokyo ダイジェストApplicationαʔόʔ APIαʔόʔܦ࿏୳ࡧΤϯδϯαʔόʔશจݕࡧΤϯδϯαʔόʔDBσʔληϯλʔαʔϏεڞ༗DBBefore
AWS Summit Tokyo ダイジェストAfterALBAmazon ECSALBCLBAmazon EC2RDSAccess LogAmazon ECSAmazon ECSALB⼀部オンプレへもリクエストApplication サーバー API サーバー全⽂検索 サーバー経路探索エンジンサーバー
トピックス• ELBのアイドルタイムアウトにハマる• ECS Agentの接続性監視• インスタンスIDとDockerコンテナIDのマッピング• コンテナインスタンスのドレイニング• オートスケールとデプロイの両⽴
ELBのアイドルタイムアウトにハマる• ELB配下にWEBサーバを置く場合、KeepAliveを利⽤することで ELB⇔バックエンド間の接続効率が上がる• ELBのアイドルタイムアウト < WEBサーバのKeepAliveTimeout としないと、WEBサーバが切断したTCPセッションにELBが接続 してしまい、ELBで504エラーが発⽣する場合がある• ELBのアイドルタイムアウト値を修正し、解決
ECS Agentの接続性監視• DescribeContainerInstances APIのagentConnectedでECS Agentの 接続性を確認できる• ECS AgentはECSエンドエンドポイントに対してHTTPS通信しており、これを切断するとすぐにagentConnectedがfalseになる
ECS Agentの接続性監視https://www.slideshare.net/AmazonWebServices/amazon-ecs-with-docker-aws-public-sector-summit-2016ここの話
ECS Agentの接続性監視• agentConnectedがfalseのインスタンスは⾃動でクラスタから除外されず、タスクの状態も更新されないため放置しておくと更新時などにサービスの安定性に影響がでる• CW Event + Lambdaで定期的に疎通監視
インスタンスIDとDockerコンテナIDのマッピング• 調査などでインスタンスIDとDokcerコンテナIDをマッピングしたい時がある• ECS上からはEC2インスタンスIDとコンテナインスタンスID、タスクArnは確認できるが、DockerコンテナIDを確認するにはホスト上でintrospection APIを実⾏する必要がある• ECS ID MapperなどのOSSツールを利⽤するか、全EC2インスタンスにSSHしてintrospection APIを実⾏してコンテナIDを突き合わせる必要がある。。
インスタンスIDとDockerコンテナIDのマッピング• ログフォワダーのサイドカーfluentdコンテナ起動時にEC2のメタデータ取得APIを叩いて、fluentd.confをsedしてインスタンスIDをログデータに付与することで解決。
Dockerコンテナのメトリクス監視• ECSクラスター、サービスのメトリクス監視はCloudWatchで可能• コンテナごとの細かいメトリクス監視はできないため、datadogを利⽤して詳細なメトリクスを監視• CloudWatchだけでできるとダッシュボードが統⼀できて嬉しい!!!
コンテナインスタンスのドレイニング• サービス、クラスタースケールイン時にはインスタンスドレイニングを利⽤し、タスク、インスタンス削除に猶予を持たせている。• AWSブログでLambdaのサンプルが記載されているが、クラスターサイズが⼤きいとListContainerInstances APIの呼び出しでAPIのスロットリングが発⽣してしまうので、クラスターサイズによってはsleepなどの考慮が必要
オートスケールとデプロイの両⽴• 乗換サービスの特性上、⼈が移動する時間帯はアクセスが増えるため、オートスケーリングを導⼊している• サービスの更新にはecs-deployをカスタマイズして利⽤• ECSサービス更新中にサービスオートスケールが発動すると実⾏中のタスク数をベースに、必要数が変更された(ECS移⾏検証当時)• 例:必要数:19、実⾏数:16、スケールインアクション:2task削除でサービス更新中 → スケールインアクション発動で必要数が14(= 実⾏数16 - 2task削除)に変更
オートスケールとデプロイの両⽴• サービスオートスケールしないようCW Alarmの条件を更新してからECSサービス更新を実施することで回避 ※ECS移⾏検証当時の話なので、現在は違う挙動をするかもしれません
ECSの良かったところ• 柔軟なデプロイ• デプロイメントオプションで最⼩ヘルス率と最⼤ヘルス率を制御することで All at onceのデプロイもOne by oneのデプロイも可能
ECSの良かったところ• CloudWatch/Lambda/CloudFormationとの親和性• CloudWatch/Lambdaを組み合わせてサービスの負荷状況に合わせたスケーリングはもちろん、特定の時間でコンテナ数、クラスタサイズの増減が簡単に実現できる。 GKEのClusterAutoscalerはまだβ• ASGとELBのメトリクスでインスタンス数、ホスト数(≒コンテナ数)がCWで簡単に確認できる。
最後に要望• CloudWatchでコンテナごとのメトリクスが⾒られると⾮常に嬉しい!!!• タスク定義のYAML対応..!!• CFnテンプレート内にはyamlでかけるので内部的には対応している…?• EC2 AutoScaling終了ポリシーを考慮したタスクのスケジューリング !• すぐ終了してしまうので、EC2のスケールイン時に削除予定のインスタンスへはタスクのスケジューリングを避けて欲しい…
ご静聴ありがとうございました!