GeekFactory

int128.hatenablog.com

HackMDでGitLab認証を利用する

HackMDは同時編集が便利なコラボレーションツールです。HackMDは認証なしでも十分に使えますが、外部認証を利用するとさらに便利に使えます。公式リポジトリのドキュメントによると、HackMDは以下の認証方式に対応しています。

本稿ではGitLab認証を利用する方法を説明します。

HackMDのデプロイ

HackMDをKubernetesクラスタにデプロイします。公式の stable/hackmd Helm chart を利用すると簡単にデプロイできます。

ここでは構成管理にHelmfileを利用します。

# helmfile.yaml
releases:
  - name: hackmd
    namespace: devops
    chart: stable/hackmd
    values:
      - ingress:
          enabled: true
          hosts:
            - hackmd.{{ requiredEnv "kubernetes_ingress_domain" }}
        resources:
          limits:
            memory: 256Mi
          requests:
            memory: 256Mi
        persistence:
          size: 50Gi
        postgresql:
          install: false
          postgresHost: {{ requiredEnv "database_host" }}
          postgresDatabase: hackmd
          postgresUser: hackmd
          postgresPassword: hackmd

環境変数kubernetes_ingress_domaindatabase_host は環境に合わせて設定してください。

export kubernetes_ingress_domain=dev.example.com
export database_host=xxx.xxx..ap-northeast-1.rds.amazonaws.com
helmfile sync

https://hackmd.dev.example.com を開いてHackMDの画面が表示されたら成功です。

これでKubernetesクラスタにHackMDがデプロイされました。

GitLabの設定

GitLabの管理画面で Applications を開き、New application ボタンをクリックします。以下の項目を入力します。

  • Name: hackmd
  • Redirect URI: https://hackmd.dev.example.com/auth/gitlab/callback
  • Trusted: YES
  • Scopes: api

System OAuth applicationsに hackmd が追加されたことを確認します。

HackMDの設定

HackMDでGitLab認証を設定するには以下の環境変数を設定します。

名前 設定値
HMD_DOMAIN HackMDのドメイン hackmd.dev.example.com
HMD_URL_ADDPORT HackMDのポート 443
HMD_PROTOCOL_USESSL HackMDでHTTPSを利用している場合はtrue true
HMD_GITLAB_BASEURL GitLabのURL https://gitlab.dev.example.com
HMD_GITLAB_CLIENTID 前項で追加したOAuth ClientのApplication ID
HMD_GITLAB_CLIENTSECRET 前項で追加したOAuth ClientのSecret

Helmfileを利用している場合は以下のように環境変数を追加します。

# helmfile.yaml
releases:
  - name: hackmd
    namespace: devops
    chart: stable/hackmd
    values:
      - ingress:
          enabled: true
          hosts:
            - hackmd.{{ requiredEnv "kubernetes_ingress_domain" }}
        resources:
          limits:
            memory: 256Mi
          requests:
            memory: 256Mi
        persistence:
          size: 50Gi
        postgresql:
          install: false
          postgresHost: {{ requiredEnv "database_host" }}
          postgresDatabase: hackmd
          postgresUser: hackmd
          postgresPassword: hackmd
        extraVars:
          - name: HMD_DOMAIN
            value: hackmd.{{ requiredEnv "kubernetes_ingress_domain" }}
          - name: HMD_URL_ADDPORT
            value: "443"
          - name: HMD_PROTOCOL_USESSL
            value: "true"
          - name: HMD_GITLAB_BASEURL
            value: https://gitlab.{{ requiredEnv "kubernetes_ingress_domain" }}
          - name: HMD_GITLAB_CLIENTID
            value: xxx
          - name: HMD_GITLAB_CLIENTSECRET
            value: xxx

HackMDのトップページでサインインをクリックした時にGitLabでサインインというボタンが表示されたら成功です。

See Also

WZR-HP-AG300Hのファームウェアを書き換える (macOS)

macOSでWZR-HP-AG300Hのファームウェアを書き換える方法を説明します。DD-WRTの書き込みや純正ファームへの書き戻しに使えます。

まず、WZR-HP-AG300HのLAN側ポートを有線LANでMacBookに接続します。IPアドレスは以下を設定します。

WZR-HP-AG300Hは電源を入れておきます。

NICのインタフェース名を確認します。ここでは en2 とします。

$ ifconfig
en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500

APRテーブルを手動で設定します。

sudo arp -s 192.168.11.1 02:AA:BB:CC:DD:20 en2
$ arp -a
? (192.168.11.1) at 2:aa:bb:cc:dd:20 on en2 permanent [ethernet]

ここで、WZR-HP-AG300Hの電源を入れ直します。すると、数秒後にTFTPのアップロードを実行できるタイミングが来ます。

  1. USBコネクタのLEDが光る(2〜3秒)
  2. USBコネクタのLEDが消える
  3. EthernetポートすべてのLEDが光る(2〜3秒)
  4. EthernetポートすべてのLEDが消える
  5. MacBookと接続しているポートのLEDが光る
  6. TFTPのアップロードを実行できる(4秒間)

下記の記事が分かりやすいので参照してみてください。

koyama4284.blogspot.com

TFTPのアップロードを実行できるタイミングがきたら以下を実行します。

echo -e "verbose\nbinary\nput wzr_hp_ag300h_jp_175" | tftp 192.168.11.1

MacBookと接続しているポートのLEDが光ったら何回か実行してみてください。以下のように、最初の数回はエラーが出ると思います。

% echo -e "verbose\nbinary\nput wzr_hp_ag300h_jp_175" | tftp 192.168.11.1
Verbose mode on.
mode set to octet
putting wzr_hp_ag300h_jp_175 to 192.168.11.1:wzr_hp_ag300h_jp_175 [octet]
tftp: sendto: Can't assign requested address

% echo -e "verbose\nbinary\nput wzr_hp_ag300h_jp_175" | tftp 192.168.11.1
Verbose mode on.
mode set to octet
putting wzr_hp_ag300h_jp_175 to 192.168.11.1:wzr_hp_ag300h_jp_175 [octet]
Sent 20472060 bytes in 9.4 seconds [17423030 bits/sec]

TFTPのアップロードが完了したら、正面のLEDが赤色になってファームウェアの焼き込みが始まります。数分後に正面のLEDが緑色になれば成功です。

先ほど設定したARPテーブルのエントリを削除します。

sudo arp -d 192.168.11.1

ブラウザで http://192.168.11.1 を開くと見慣れた設定画面が表示されるはずです。

TerraformでプライベートサブネットとNATゲートウェイを管理する

AWSのNATゲートウェイ構成をTerraformで管理する方法を調べたのでまとめます。

NATゲートウェイ構成とは下記のような構成を指します。

次の図は、NAT ゲートウェイを使用した VPCアーキテクチャを示しています。メインルートテーブルは、プライベートサブネットのインスタンスから NAT ゲートウェイにインターネットトラフィックを送信します。NAT ゲートウェイは、NAT ゲートウェイの Elastic IP アドレスをソース IP アドレスとして使用し、インターネットゲートウェイトラフィックを送信します。

https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/images/nat-gateway-diagram.png https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html

マネジメントコンソールでNATゲートウェイを構成する場合は以下の流れで行います。パブリックサブネットはすでに存在する前提です。

  1. プライベートサブネットを作成する。
  2. EIPを確保する。
  3. パブリックサブネットにNATゲートウェイを作成する。
  4. ルートテーブルを作成し、デフォルトゲートウェイをNATゲートウェイに向ける。
  5. プライベートサブネットにルートテーブルをアタッチする。

Terraformの場合は以下のリソースを定義します。

  • プライベートサブネット (aws_subnet)
  • EIP (aws_eip)
  • NATゲートウェイ (aws_nat_gateway)
  • ルートテーブル (aws_route_table)
  • ルートテーブルの関連付け (aws_route_table_association)

実装例

具体的なコードを見ていきましょう。

説明を簡単にするため、ここではVPCとパブリックサブネットがすでに存在しており、そこにNATゲートウェイを付け加える場面を考えます。

# すでに存在するVPCを参照
data "aws_vpc" "example" {
  tags {
    Name = "example_vpc"
  }
}

# すでに存在するパブリックサブネットを参照
data "aws_subnet" "public" {
  vpc_id            = "${data.aws_vpc.example.id}"

  tags {
    Name = "example_public_subnet"
  }
}

resource "aws_subnet" "private" {
  vpc_id     = "${data.aws_vpc.example.id}"
  cidr_block = "${cidrsubnet(data.aws_vpc.example.cidr_block, 3, 4)}"

  tags {
    Name = "example_private_subnet"
  }
}

resource "aws_eip" "nat_gateway" {
  vpc = true

  tags {
    Name = "example_nat_gateway_eip"
  }
}

resource "aws_nat_gateway" "private" {
  allocation_id = "${aws_eip.nat_gateway.id}"
  subnet_id     = "${data.aws_subnet.public.id}"

  tags {
    Name = "example_nat_gateway"
  }
}

resource "aws_route_table" "private" {
  vpc_id = "${aws_subnet.private.vpc_id}"

  route {
    cidr_block     = "0.0.0.0/0"
    nat_gateway_id = "${aws_nat_gateway.private.id}"
  }

  tags {
    Name = "example_private_subnet_route_table"
  }
}

resource "aws_route_table_association" "private" {
  route_table_id = "${aws_route_table.private.id}"
  subnet_id      = "${aws_subnet.private.id}"
}

サブネットのCIDRはべた書きしてもよいですが、ここでは cidrsubnet() を使ってVPC CIDRから自動計算しています。以下のように記述すると、VPC CIDRの上位3ビットをサブネットに確保します。

  cidr_block = "${cidrsubnet(data.aws_vpc.example.cidr_block, 3, 0)}"

例えば、VPC CIDRが 172.20.0.0/16 の場合、サブネットのCIDRは 172.20.0.0/19 が割り当てられます。サブネットマスク長が16 + 3 = 19になるということです。

  cidr_block = "${cidrsubnet(data.aws_vpc.example.cidr_block, 3, 4)}"

と記述すると、サブネットのCIDRは 172.20.128.0/19 が割り当てられます。/16 の上位3ビットに4(100)を割り当てるので128(1000 0000)になるということです。説明が難しい。

まとめ

TerraformでプライベートサブネットとNATゲートウェイを定義するのは意外と簡単でした。

See Also: