DRY

Web関連の技術の事、食事/お酒の事、旅行の事など

Circle Ciでlocalhostへ設定してあるfluentdを使用する方法とcircle.yml

現在とあるRuby on RailsのプロジェクトでCircle Ciを使っているのですが、その中でfluent-logger-rubyを使っています。

Fluent::Logger::FluentLogger.open(nil, :host => localhost, :port => 24224)

こんな感じですね。 それでこれをまんまCircle CiでRspecしようとすると、当然Circle Ciのログで

ERROR -- : Failed to connect fluentd: Connection refused - connect(2) for "localhost" port 24224

とエラーが出てfailしてしまいます。

どうしたものかわからなかったので、Live Supportに問い合わせたところ「sudo出来るように設定を変更するので、そこでapt getでもして」という回答をもらったので、それを反映したcircle.ymlがこちら

machine:
  ruby:
    version: 2.1.2

dependencies:
  pre:
    - curl -L http://toolbelt.treasure-data.com/sh/install-ubuntu-precise.sh | sh
    - sudo cp config/circle/td-agent.conf /etc/td-agent/td-agent.conf
    - sudo /etc/init.d/td-agent stop
    - sudo /etc/init.d/td-agent start

database:
  override:
    - mv config/circle/database.yml config/database.yml
    - bundle exec rake db:create db:migrate db:seed --trace

Circle Ci用の設定ファイルが複数になったので、config/circle/ 以下に入れています。

config/circle/td-agent.confの中身は単純にこんな感じです

<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>
<match **>
  type stdout
</match>

これでRspecがfluentdアクセスの部分でエラーを吐く事は無くなりました。
でもCircleCi + fluentd 使ってる方たちって他どうやってるんでしょうかね?検索してもあまり事例なかったので。

あとついでにもう一つ気になっているのが、EC2上のサーバにDeployする時のSSHのSecurityGroupの設定なんですが これも皆さんどうしてるものなんですかね?

今回は別途chefでサーバを作っていますが、capistranoからaws-sdkを用いてもDockerだとしても、CircleCiからEC2サーバに何かさせる時に どうするか?という点では同じかと。

CircleのSourceで全部やってるんですかね???

なので該当のサーバからtemporaryで空けてやっています。
そのスクリプトはこのクラスメソッドさんのエントリ のが良いので 参考にさせて頂いて、このDeploy用のIAM circleciを用意して都度Open/Closeしています。

具体的には
config/circle/openssh.sh

    #!/bin/sh
    export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY>
    export AWS_DEFAULT_REGION=ap-northeast-1

    MYSECURITYGROUP=<MYSECURITYGROUP>
    MYIP=`curl -s ifconfig.me`

    aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32

config/circle/closessh.sh

    #!/bin/sh
    export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID>
    export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY>
    export AWS_DEFAULT_REGION=ap-northeast-1

    MYSECURITYGROUP=<MYSECURITYGROUP>
    MYIP=`curl -s ifconfig.me`

    aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32

ただし、現状のCircleCiのUbuntuに入っているawsコマンドはバージョンが古いのでこれをそのまま事項すると

--group-id: mispelled meta parameter?

とエラーになってしまうので、バージョンUPするコマンドもcircle.ymlに忍ばせています。

machine:
  ruby:
    version: 2.1.2

hosts:
  localhost: 127.0.0.1
  staging-web: xx.xx.xx.xx

dependencies:
  pre:
    - curl -L http://toolbelt.treasure-data.com/sh/install-ubuntu-precise.sh | sh
    - sudo cp config/circle/td-agent.conf /etc/td-agent/td-agent.conf
    - sudo /etc/init.d/td-agent stop
    - sudo /etc/init.d/td-agent start
    - sudo pip install awscli

database:
  override:
    - mv config/circle/database.yml config/database.yml
    - bundle exec rake db:create db:migrate db:seed --trace

deployment:
  staging:
    branch: master
    commands:
      - sh config/circle/openssh.sh
      - bundle exec cap staging deploy
      - sh config/circle/closessh.sh

といった感じなのですが。
欠点は全体的に時間がかかってしまう事ですかね〜