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

ありがとうございました