Carpe Diem

備忘録

ECS + awsvpc + Consul でService Discovery

概要

ECS + awsvpc + Consul でService Discoveryができるようにします。
最終的にConsulにDNS問い合わせすることでECSのコンテナのIPを知ることができるようにします。

環境

  • Consul 1.1.0

Task Definition

結論を先にいうと以下のようになります。

[
  {
    "name": "consul-agent",
    "image": "consul:1.1.0",
    "memoryReservation": 128,
    "network_mode": "awsvpc",
    "environment": [
      {
        "name": "CONSUL_LOCAL_CONFIG",
        "value": "{\"service\":{\"name\":\"api\",\"tags\":[\"development\"]}}"
      },
      {
        "name": "CONSUL_BIND_INTERFACE",
        "value": "eth0"
      }
    ],
    "command": [
      "agent",
      "-retry-join",
      "consul-1a-01.example.io",
      "-retry-join",
      "consul-1c-01.example.io",
      "-retry-join",
      "consul-1d-01.example.io"
    ],
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-region": "ap-northeast-1",
        "awslogs-group": "dev-consul"
      }
    }
  },
  {
    // APIコンテナ
  }
]
続きを読む

Consulで各サービスのコンテナ群のIPを取得する

概要

以前Consulの基本的な使い方を紹介しました。

christina04.hatenablog.com

このConsulに登録する各ノードに対しサービス設定をすることで、各マイクロサービスに所属しているコンテナ群のIPを取得できるようします。
それによってgRPCでの負荷分散としてのClient-side LBが、動的なコンテナに対しても可能になります。

環境

  • Consul 1.1.0
  • docker 18.03.1-ce
  • docker-compose 1.21.1
続きを読む

TerraformでECSのawsvpcモードを使って各コンテナにPrivate IPを振る

概要

これまでは1インスタンス上に複数のコンテナを使うときは動的ポートマッピングのような方法で対応する必要がありました。

christina04.hatenablog.com

しかしawsvpcモードが使えるようになったことでコンテナ毎にPrivateIPを振れるようになり、ポートでなくIPベースで複数のコンテナを扱えるようになりました。
今回はその方法をterrraformで実現します。

環境

  • Terraform v0.11.7
  • terraform-provider-aws v1.20.0
続きを読む

ホストからdockerのvolumeにファイルをコピー

概要

ホストからコンテナ(が持ってるvolume)へのコピーdocker cpでできます。
しかしホストから直接volume単体にコピーするのはどうすれば良いのだろう?と思って調べたところ地味にサポートされていなかったのでメモとして残します。

環境

  • Docker v18.03.1-ce

方法

こちらで議論されてました。

github.com

issue自体は関連issueでどうするか進める、という結論であとはワークアラウンドが書かれています。
※議論を進めているissueも実装が難しい割に簡単なワークアラウンドがあるので置いておきますで止まってます

続きを読む

Kubernetesのheadless serviceを使って各PodのIPを知る

概要

gRPCを用いた負荷分散ではEnvoyを使ったL7のバランシングが最近の主流になっています。
ただEnvoyが各Podに振り分けるためにPodのIPを知る必要があります。
ECSはService Discoveryを持っていないので自前でたてるか、control planeを用意してそれをService Discoveryにする必要がありますが、Kubernetesはheadless serviceがあります。
headless serviceはServiceに対してDNSリクエストをすると、動いているPodのIPアドレス一覧を返してくれるのでこれをService Discoveryとして使うことが可能です。

今回はheadless serviceとして動かすところだけ検証しました。

環境

  • minikube v0.26.1
  • kubernetes 1.8.6
続きを読む

GoのRoundTripperとTransport

背景

僕が保守している go-iapというGoで書いたAppStore, GooglePlay AmazonAppStore用の課金ライブラリ があるのですが、そこに以下のissueがあがっていました。

github.com

ざっくり説明すると「GAEでは普通のhttp.Client使えないからカスタムClientサポートして」という内容で、AWAではAWSがメインでGAEからこれを使うことがなかったため検証もできず、誰か対応するプルリクくれないかなぁとずっと放置して待っていました。

これを最近対応したのですが、その時にRoundTripperTransportについて学んだのでまとめます。

続きを読む

Exponential Backoff (指数関数的に増えるリトライ間隔)

概要

fluentdのretryはExponential Backoffと呼ばれるもので、リトライの間隔が

1秒、2秒、4秒、8秒、16秒

と指数関数的に増えていきます。これによって無駄なリクエストを省きつつ、再試行する前に問題を修正して解決できるようになります。
特に外部APIが長期障害発生時に、単調に繰り返しリトライするとシステムへの不必要な負担をかけるので、そういった問題時の負荷軽減にもなります。

docs.fluentd.org

続きを読む