[CircleCI][AWS][Rails]OrbsのCommandsをつかってECR/ECS/Fargateにデプロイする
前回はAWS FargateでCircleCIのOrbsを使ってRails環境のデプロイを実装しましたが、今回はWordPressとなります。PHPでのECS/Fargateは初!上記の記事よりめちゃくちゃシンプルなデプロイとなるので、まずは環境から紹介したいと思います。
■環境
- DBはRDS(Aurora)
- 画像はS3に保存(WP Offload S3 Lite)
- それ以外のコードはリポジトリ化
- Docker imageは
php:7.3-fpm-alpine
を使用 - その中にNginxとsuperviserをインストール
■デプロイの構成
前回と変わったところは②のS3からwp-config.phpをcopyしてくるというところで、以前は echo
で .env
に環境変数を吐くように書いていましたが、メンテしづらいということや、CircleCIのconfig.ymlも見づらいということもあって今回S3から取ってくるように作ってみました。デプロイはdevelopブランチにマージするとstg環境がデプロイされ、masterマージすると本番反映されます。以下はディレクトリ構成となります。
- ディレクトリ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
├── wordpress │ └── wp-config.php └── docker └── stg └── wordpress ├── Dockerfile ├── README.md ├── common │ └── prompt.sh ├── nginx │ ├── default.conf │ ├── nginx.conf │ ├── stg.adachin-wordpress.jp.conf │ └── www.conf ├── php │ ├── php-fpm.conf │ ├── php.ini │ └── www.conf └── supervisor ├── app.conf └── supervisord.conf |
- nginx/default.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
server { listen 80 default_server; server_name _; access_log /var/log/nginx/default_access.log main; error_log /var/log/nginx/default_error.log warn; root /var/www/wordpress; location ~ \.php { if ($request_uri !~ /ping.php) { return 404; break; } # ELB health check if ($http_user_agent !~* "ELB-HealthChecker") { return 404; break; } } } |
- ping.php
1 2 3 4 |
<?php // status ok header('HTTP/1.1 200 OK'); echo 'pong'; |
このdefault.confはELBのヘルスチェックで/ping.phpにアクセスするとレスポンスを返すようにステータスチェックをしていますが、ELBのログはCloudWatchLogsに出したくないので404を返すようにELB側で制御しています。これでコンテナが落ちることはない!
余談ですが、AWSのWordPressはロードバランサー挟むと真っ白になるので以下を参考に。
■CircleCI
- config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
version: 2.1 orbs: aws-ecr: circleci/aws-ecr@6.7.0 aws-ecs: circleci/aws-ecs@1.1.0 executors: docker_build: machine: docker_layer_caching: true jobs: deploy_wordpress_stg: working_directory: ~/app executor: docker_build steps: - checkout - run: name: setting aws configure command: | aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID_STG} \ && aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY_STG} - run: name: copy wp-config.php command: | aws s3 cp s3://stg.adachin.jp/wordpress/wp-config.php ./wp-config.php.corp - aws-ecr/build-and-push-image: account-url: AWS_ECR_ACCOUNT_URL_STG aws-access-key-id: AWS_ACCESS_KEY_ID_STG aws-secret-access-key: AWS_SECRET_ACCESS_KEY_STG region: AWS_REGION repo: 'wordpress' dockerfile: docker/stg/wordpress/Dockerfile tag: "${CIRCLE_SHA1}" - aws-ecs/update-service: family: 'wordpress' service-name: 'wordpress-service' cluster-name: 'adachin' container-image-name-updates: 'container=wordpress,image-and-tag=${AWS_ECR_ACCOUNT_URL_STG}/wordpress:${CIRCLE_SHA1}' deploy_wordpress_prd: ~省略~ workflows: version: 2 deploy_stg: jobs: - deploy_wordpress_stg: filters: branches: only: develop deploy_prd: jobs: - deploy_wordpress_prd: filters: branches: only: master |
- Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
FROM php:7.3-fpm-alpine ENV APP_ROOT /var/www/wordpress WORKDIR $APP_ROOT # Setup UTC+9 RUN apk --update add tzdata && \ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ apk del tzdata && \ rm -rf /var/cache/apk/* # install packages RUN apk update && \ apk upgrade && \ apk add --update --no-cache \ autoconf \ bash \ build-base \ freetype-dev \ g++ \ gcc \ git \ libjpeg \ libjpeg-turbo \ libjpeg-turbo-dev \ libpng \ libpng-dev \ libxml2-dev \ libxpm-dev \ libxslt-dev \ libwebp-dev \ jpeg-dev \ make \ mysql-dev \ nginx \ openssl \ sudo \ supervisor \ tzdata \ vim \ yaml-dev \ zlib-dev RUN docker-php-ext-configure gd \ --with-freetype-dir=/usr/lib/ \ --with-png-dir=/usr/lib/ \ --with-jpeg-dir=/usr/lib/ \ --with-gd RUN docker-php-ext-install pdo_mysql soap mysqli gd # make directory RUN mkdir -p $APP_ROOT COPY . $APP_ROOT WORKDIR /var/www/wordpress # Create adachin user RUN adduser -D adachin RUN passwd -u adachin RUN echo "adachin ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers RUN echo Set disable_coredump false > /etc/sudo.conf COPY docker/stg/wordpress/common/prompt.sh /etc/profile.d/ RUN chmod 755 /etc/profile.d/prompt.sh # mv wp-config.php RUN mv wp-config.php.corp wordpress/wp-config.php # nginx COPY docker/stg/wordpress/nginx/stg.adachin-wordpress.jp.conf /etc/nginx/conf.d/stg.adachin-wordpress.jp.conf COPY docker/stg/wordpress/nginx/www.conf /etc/nginx/conf.d/www.conf COPY docker/stg/wordpress/nginx/nginx.conf /etc/nginx/nginx.conf COPY docker/stg/wordpress/nginx/default.conf /etc/nginx/conf.d/default.conf # PHP RUN rm -f /usr/local/etc/php-fpm.conf.default RUN rm -f /usr/local/etc/php-fpm.d/zz-docker.conf COPY docker/stg/wordpress/php/php-fpm.conf /usr/local/etc/php-fpm.conf COPY docker/stg/wordpress/php/php.ini /usr/local/etc/php/php.ini COPY docker/stg/wordpress/php/www.conf /usr/local/etc/php-fpm.d/www.conf # setting superviser COPY docker/stg/wordpress/supervisor/supervisord.conf /etc/supervisord.conf COPY docker/stg/wordpress/supervisor/app.conf /etc/supervisor/conf.d/app.conf RUN echo files = /etc/supervisor/conf.d/*.conf >> /etc/supervisord.conf # link logs nginx RUN ln -sf /dev/stdout /var/log/nginx/www.access.log RUN ln -sf /dev/stderr /var/log/nginx/www.error.log RUN ln -sf /dev/stdout /var/log/nginx/stg.adachin-wordpress.jp.access.log RUN ln -sf /dev/stderr /var/log/nginx/stg.adachin-wordpress.jp.error.log # Service to run CMD ["/usr/bin/supervisord"] |
CircleCIではS3からwp-config.phpを持ってきてDockerfileからbuildとECR、ECSタスク定義、サービスの更新をするという非常にシンプルな作りとなっています。ただ、wp-config.phpをコピーした後にCircleCIでcheckoutされてしまうので、Dockerfileでmvでファイルを移動しています。(ここらへん気持ち悪いけど何かいい方法ないものか..) あとはDocker imageがAlpineのphp-fpmを使っているということで、phpの設定ファイルの場所(/usr/local/etc/)が変わっていたり、優先順位などで反映されずphp-fpm.d/zz-docker.confなどは削除しています。これでデプロイの時間は約2分くらい。
■まとめ
CircleCIのデバッグに時間取られたけど、前回の経験もあってすんなり実装することができたので良き!CakePHPの場合は composer install
入れるだけなのでこのDockerfile使いまわせそうですね。
余談だけど aws configure
ってワンライナーでいけることを知った。
0件のコメント