Route 53の設定をコンソールでポチポチするのが辛くなってきたので、Ruby製のRoadworkerでDNSの設定を管理して、CircleCIでリポジトリに変更をPushするだけで反映されるようにしました。

環境

  • macOS High Sierra(10.13.6)
  • Ruby 2.5.0p0
  • Bundler 1.16.2
  • Roadworker 0.5.8

RoadworkerのインストールとRoute 53の管理

以下を参考に進めました。

既存の設定をエクスポートする際に--splitオプションを使うとHosted Zoneごとにファイルを分割してくれるので便利でした。

$ bundle exec roadwork -e --split

CircleCIで自動的に反映するように設定

ここで問題が発生しました。

最初は以下のような.circleci/config.ymlを作り、

version: 2

jobs:
  test:
    docker:
      - image: circleci/ruby:2.5-node-browsers
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-
      - run:
          name: Install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
          paths:
            - ./vendor/bundle
      - run:
          name: Test
          command: bundle exec roadwork -a --dry-run

  apply:
    docker:
      - image: circleci/ruby:2.5-node-browsers
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-
      - run: bundle --path vendor/bundle
      - run:
          name: Apply
          command: bundle exec roadwork -a

workflows:
  version: 2
  test_and_apply:
    jobs:
      - test
      - apply:
          filters:
            branches:
              only: master
          requires:
            - test

リポジトリにプッシュすると、testジョブのbundle installが以下のエラ=を吐いて落ちていました。

(...)
Installing aws-sdk-resources 3.25.0
Fetching aws-sdk 3.0.1
Installing aws-sdk 3.0.1
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/circleci/repo/vendor/bundle/ruby/2.5.0/gems/pcaprub-0.13.0/ext/pcaprub_c
/usr/local/bin/ruby -r ./siteconf20181002-82-1hq923q.rb extconf.rb

[*] Running checks for pcaprub_c code...
platform is x86_64-linux
checking for ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_thread_call_without_gvl()... yes
checking for pcap_open_live() in -lpcap... no
checking for pcap_setnonblock() in -lpcap... no
creating Makefile

current directory:
/home/circleci/repo/vendor/bundle/ruby/2.5.0/gems/pcaprub-0.13.0/ext/pcaprub_c
make "DESTDIR=" clean

current directory:
/home/circleci/repo/vendor/bundle/ruby/2.5.0/gems/pcaprub-0.13.0/ext/pcaprub_c
make "DESTDIR="
compiling pcaprub.c
pcaprub.c:11:18: fatal error: pcap.h: No such file or directory
 #include <pcap.h>
                  ^
compilation terminated.
Makefile:242: recipe for target 'pcaprub.o' failed
make: *** [pcaprub.o] Error 1

make failed, exit code 2

Gem files will remain installed in
/home/circleci/repo/vendor/bundle/ruby/2.5.0/gems/pcaprub-0.13.0 for inspection.
Results logged to
/home/circleci/repo/vendor/bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/pcaprub-0.13.0/gem_make.out

An error occurred while installing pcaprub (0.13.0), and Bundler cannot
continue.
Make sure that `gem install pcaprub -v '0.13.0' --source
'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  roadworker was resolved to 0.5.8, which depends on
    net-dns2 was resolved to 0.8.7, which depends on
      packetfu was resolved to 1.1.13, which depends on
        pcaprub
Exited with code 5

これについては、以下の記事のようにlibpcap-devをインストールすると直ります。 以下はCircleCI 1.0時代の話ですが、大丈夫でした。

(...)
      - v1-dependencies-
- run:
    name: Install dependencies
    command: |
      sudo apt-get install libpcap-dev    # これを追記
      bundle install --jobs=4 --retry=3 --path vendor/bundle
- save_cache:
(...)

これで、もうコンソールをポチポチしなくても済みそうです!