Carpe Diem

備忘録。https://github.com/jun06t

curlのresolvオプションで名前解決

背景

ドメイン移管の関係でCloudFrontのDNSレコードをDNSimpleからRoute53へ移そうとしていたのですが、完全な移管手続前にRoute53側のレコードでエッジサーバにちゃんとアクセスできるか確認する必要がありました。
digのNS指定を使えばエッジサーバのIPは確認できますが、CloudFrontを直IP指定でアクセスしても403が返るだけです。
そこでcurlresolvオプションを使うことで、IPを指定しつつドメイン名でアクセスするようにしました。

環境

手順

エッジサーバのIPを取得

まずCloudFrontのエッジサーバを見つけます。

続きを読む

GoでGraceful Shutdown

概要

以前はGraceful shutdownをするために以下のようなライブラリを使用していました。

github.com

しかしながらGo 1.8 からGraceful Shutdown機能が標準で提供されるようになりました。
今回はその導入方法を紹介します。

環境

続きを読む

Consulを支える技術

概要

ConsulではSWIMやRaftといった技術を使っています。
今回はそれらを説明します。

環境

  • Consul 1.1.0

SWIM

Gossip Protocol

SWIMはGossip Protocolの一種で、主に

  • クラスタのメンバ管理機能
  • メンバの障害検出機能
  • イベント伝播

で使われています。

続きを読む

Dockerの埋め込みDNSサーバを使ったService Discovery

概要

Docker 1.10からユーザ定義のネットワークでは内蔵DNSサーバが用意され、名前解決ができるということを以下の記事で述べました。

christina04.hatenablog.com

実は単に名前解決ができるだけでなく、Service Discoveryとしても機能するのでその紹介をします。

環境

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

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
続きを読む