PHPなプロダクトをAmazon ECSで開発運用してる話
by
taiko19xx
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
PHPなプロダクトをAmazon ECS で開発運用してる話 PHPカンファレンス北海道出張版(仮) PHPオフ会@2017/11/25 @taiko19xx / 木村 俊彦
Slide 2
Slide 2 text
Amazon ECS使ってみた PHPカンファレンス北海道出張版(仮) PHPオフ会@2017/11/25 @taiko19xx / 木村 俊彦
Slide 3
Slide 3 text
こんにちは • PHPを使ったプロダクトをDockerとAmazon ECSで開発運用して いますので得られた知見を共有します • DockerとECSの話がメインです • PHPカンファレンスとは?
Slide 4
Slide 4 text
もくじ • ECS(EC2 Container Service)とは • 構成図 • 何故ECSか • Docker/ECSで… • 良かった所 • 苦労した所 • 全体のまとめ
Slide 5
Slide 5 text
ECS(EC2 Container Service)とは • EC2上のDockerコンテナを管理できる • いわゆるコンテナオーケストレーションのサービス • 無料 • コンソール/AWS CLI/ECS CLI/AWS SDKから操作可能 • マネージドなコンテナレジストリも利用可能 • ECR(EC2 Container Registry) • ログインがめんどくさい • $0.1/GB/月 + 転送料
Slide 6
Slide 6 text
構成図
Slide 7
Slide 7 text
何故ECSか • AWS上に構築するという方針は決まっていた • Dockerで構築するのはどうかという話が出た • 管理をどうするか考えていた所、ECS/ECRを見つけた • 確認や検証の結果、採用する事に
Slide 8
Slide 8 text
Docker/ECSで良かった所
Slide 9
Slide 9 text
ローカルとリモートで”ほぼ”同様の環境が使える • ローカルはdocker-composeで • リモートもそれに近いように • イメージはCodeBuildでdocker-composeを使ってビルド • 環境はCloudFormationで同等の環境を構築
Slide 10
Slide 10 text
ローカルとリモートで”ほぼ”同様の環境が使える • 100% docker-composeを使い回す事はできなかった • ECS CLIを利用すれば可能 • CloudFormationにおけるECSのServiceの記述はdocker- composeに比較的近い • 0から書き直しにはならない • 両方ともYAML
Slide 11
Slide 11 text
展開しやすい • Dockerベースなので、誰でも環境を起動できるように • リポジトリをcloneしたら環境構築して起動するだけ • コンテナ起動時にcomposer installするように仕込んでいた • VMやVagrantと違い、重いイメージファイルを配布せずに済む • ただし、以下の面で幸運だったという可能性も • 利用者が全員mac • フロント側も含めて全員コマンドの操作に慣れていた
Slide 12
Slide 12 text
開発環境構築にかかる時間が少ない • 基本的にはdocker-compose.ymlと必要なDockerfile書いて終わり • ただし… • 記述に慣れていれば、最低限の立ち上げは早そう • あくまで”開発環境” • AWS側はCloudFormationの記述やら各種設定が大変だった
Slide 13
Slide 13 text
Docker/ECSで苦労した所
Slide 14
Slide 14 text
結局Dockerfileを追加変更する事になる • PHPのコンテナ(php:7-fpm-alpine)はそのまま使う予定だったが Dockerfileでカスタムした • タイムゾーンの変更 • メモリやファイルアップロード周りの設定変更 • Composerの追加 • 拡張の追加 • docker-php-ext-installをRUNする • nginxは最初に1度調整したのみ
Slide 15
Slide 15 text
変わった事をしようとすると一工夫がいる • cron • 各コンテナにはcrondが入ってるが、デフォルトで起動しない • 各サービスやデーモンと同時に起動する必要がある • コンテナ起動時に実行するスクリプトを用意し、その中に記 述 • cron専用コンテナを使わずにPHPコンテナ内でスクリプトを起 動している
Slide 16
Slide 16 text
変わった事をしようとすると一工夫がいる • 一時的にコンテナを止める必要がある時 • 今回はDBのバックアップ時に一時停止 • コールドバックアップ • SDK経由でECSを操作 • 手動で停止すると自動で復活するので、回避する設定変更も 必要 • 上記設定を戻せば元のコンテナが立ち上がるので、リカバ リー処理は楽
Slide 17
Slide 17 text
デプロイフローが複雑になった:開始前の想定
Slide 18
Slide 18 text
設計完了!
Slide 19
Slide 19 text
デプロイフローが複雑になった:設計時点
Slide 20
Slide 20 text
Twitter [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)], via Wikimedia Commons
Slide 21
Slide 21 text
デプロイフローが複雑になった:設計時点 • リポジトリがGitLabになった • GitLabからCode(Pipeline|Build|Deploy)の直接連携は不可
Slide 22
Slide 22 text
(CodePipeLineの場合:2017年11月現在)
Slide 23
Slide 23 text
デプロイフローが複雑になった:設計時点 • リポジトリがGitLabになった • GitLab→Code(Pipeline|Build|Deploy)の直接連携は不可 • API GatewayとLambdaを追加構築 • GitLabのwebhookで起動 • S3に配置 • CodePipelineはS3をチェック
Slide 24
Slide 24 text
デプロイフローが複雑になった:設計時点 • アプリのビルドとデプロイを別途設定する必要があった • CodeBuildの追加 • CodeDeployの設定
Slide 25
Slide 25 text
リリース!
Slide 26
Slide 26 text
デプロイフローが複雑になった:リリース時点
Slide 27
Slide 27 text
Twitter [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)], via Wikimedia Commons
Slide 28
Slide 28 text
デプロイフローが複雑になった:リリース時点 • デプロイ処理に時間がかかっていた • 特にDockerのビルドとCloudFormationの適用に時間がかかる • アプリケーションのデプロイのみを行うCodePipelineを別途作成 • 大体15~20分ほどかかっていたデプロイが3分ほどに短縮 • Composerやnpmによるライブラリ取得が短縮できれば更に…?
Slide 29
Slide 29 text
全体のまとめ • 思っていたより難易度が高かった • いい勉強になりました • 学習コストも高い • また使うかと言われると正直… • 使ってみないと分からない部分もあったので、使わなければよ かったという訳ではない • フローの部分はもう少しすっきり出来たはずというのが反省点
Slide 30
Slide 30 text
自己紹介 • 木村俊彦 @taiko19xx • 株式会社SRIA
Slide 31
Slide 31 text
株式会社SRIA • Web開発 • フロントエンド制作 • バックエンド構築 • アプリ開発 • iOS/Android/UWP • その他、デザインやクラウド(Azure/AWS)構築など… • お仕事&お仲間募集中
Slide 32
Slide 32 text
自己紹介 • 木村俊彦 @taiko19xx • 株式会社SRIA • Web(フロント・バックエンド)もアプリもクラウドもやってま す • 仕事は開発したり打ち合わせに行ったり • 最近はAzureとかAWSをいじっています • 今日は仙台からおいしいものを食べに来ました
Slide 33
Slide 33 text
ありがとうございました