2021年11月5日金曜日

docker swarm で load balancing を無効にする方法

docker swarm で load balancing を無効にする方法

概要

docker swarm は Published しているポートがあるとそのポート感で自動的にロードバランシングしてくれます

外部のロードバランサなどを使わない場合は便利ですが Nginx や HAProxy、ELB などクラウドロードバランサを使う場合には無効にしたおいたほうが良いです

今回は Swarm のロードバランシングを無効にする設定を紹介します

結論: endpont_mode: dnsrr を使う

docker service create するときに --endpont-mode dnsrr を使います

docker-compose で記載すると以下のようになります (一部抜粋)

まず Ports の設定で mode: host を指定します
mode はデフォルトだと ingress なのですが ingress モードでは dnsrr が使えないので host モードを指定します
ingress と host モードの違いはこちらが参考になります

  ports:
    - target: 8080
      published: 8080
      protocol: tcp
      mode: host

次に deploy で endpoint_mode を指定します

  deploy:
    mode: replicated
    replicas: 3
    endpoint_mode: dnsrr

これで OK です

docker-compose のバージョンは v3.2 以上が必要

もしエラーになる場合はバージョンが 3.2 以上になっているか確認してください

動作確認

docker-compose に記載した場合は再度 stack deploy すれば OK です
もし反映されない場合は一度対象のサービスを削除してから stack deploy してください

docker-compose を使ってない場合は直接 service update で上記のオプションを指定すれば OK です

最後に

外部のロードバランサを使っている場合は忘れずにオフにしましょう

ちなみにオン+外部のロードバランサでも動作しますが swarm 側でもバランシングしてしまうせいで外部のロードバランサで指定しているバランシングルール通りに動かなくなるので注意してください

参考サイト

2021年11月4日木曜日

Gitlab の Wiki を CI と組み合わせて自動で更新する方法

Gitlab の Wiki を CI と組み合わせて自動で更新する方法

概要

前回の続きです
今回は CI を組み合わせて自動で Wiki が更新される仕組みにします

環境

  • Gitlab 14.3.3-ee

サンプルスクリプト (update_wiki.sh)

#!/bin/bash

[[ $HOST =~ ^https?://[^/]+ ]] && HOST="${BASH_REMATCH[0]}/api/v4/projects/"
UPLOAD_API_PATH="${CI_PROJECT_ID}/uploads"
FILE_NAME="test.jpg"

IMAGE_URL=`/usr/bin/curl -s -XPOST "${HOST}${UPLOAD_API_PATH}" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" --form "file=@${FILE_NAME}" | jq -r .markdown`

CONTENT="
# API Test Page

## List
* a
* b
* c

## Image
${IMAGE_URL}
"
TITLE="test"
BODY="format=markdown&content=${CONTENT}&title=${TITLE}&slug=${TITLE}"

WIKI_API_PATH="${CI_PROJECT_ID}/wikis/${TITLE}"

/usr/bin/curl -XPUT "${HOST}${WIKI_API_PATH}" \
  --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \
  --data "${BODY}"

.gitlab-ci.yml

stages:
  - update_wiki

update_wiki:
  image:
    name: alpine/git:latest
    entrypoint: [""]
  stage: update_wiki
  before_script:
    - "apk add curl"
    - "apk add bash"
    - "apk add jq"
    - "apk add wget"
    - "export PROJECT_ID=123"
  script:
    - "cd $CI_BUILDS_DIR/$CI_PROJECT_PATH"
    - "wget https://picsum.photos/200 -O test.jpg"
    - "chmod +x ./update_wiki.sh"
    - "HOST=${CI_PROJECT_URL} CI_PROJECT_ID=${PROJECT_ID} PRIVATE_TOKEN=${GIT_PASSWORD} ./update_wiki.sh"

解説

.gitlab-ci.yml 側で API をコールするのに必要なパラメータを変数に設定します

今まではシェルスクリプト側で HOST やシークレットトークなどを設定していましたが CI が自動で設定してくれているのでそれを使うようにします
自分で設定するのは PROJECT_ID だけになります
GIT_PASSWORD は CI の変数として Gitlab に事前に登録しています

画像は固定の画像ではなくランダムで取得するようにします
おそらく実際の場面では他のビルドで画像を作成してそれを Wiki に掲載する感じになるかなと思います

もしステージを分けて次のステージで画像情報を使う場合は artifacts.untracked: true を設定すると良いと思います

最後に

API で Wiki 編集 -> 画像をアップロードできるようにする -> CI に組み込むという流れで紹介しました

一度にゴールを目指そうとせず順を追って一つ一つ実装していくと結果的に近道になっていることは多いかなと思います

2021年11月3日水曜日

Gitlab の Wiki を API で編集し画像をアップロードする方法

Gitlab の Wiki を API で編集し画像をアップロードする方法

概要

前回の続きです
今回はファイルをアップロードしたファイルを Wiki に掲載する方法を紹介します

環境

  • Gitlab 14.3.3-ee

サンプルスクリプト

#!/bin/bash

PROJECT_ID=123
HOST="https://gitlab.example.com/"
UPLOAD_API_PATH="/api/v4/projects/${PROJECT_ID}/uploads"
PRIVATE_TOKEN="xxxxxxxxxxx"
FILE_NAME="test.png"

IMAGE_URL=`/usr/bin/curl -s -XPOST "${HOST}${UPLOAD_API_PATH}" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" --form "file=@${FILE_NAME}" | jq -r .markdown`

CONTENT="
# API Test Page

## List
* a
* b
* c

## Image
${IMAGE_URL}
"
TITLE="test"
BODY="format=markdown&content=${CONTENT}&title=${TITLE}&slug=${TITLE}"

WIKI_API_PATH="/api/v4/projects/${PROJECT_ID}/wikis/${TITLE}"

/usr/bin/curl -XPUT "${HOST}${WIKI_API_PATH}" \
  --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \
  --data "${BODY}"

解説

アップロード用の API のパスは /api/v4/projects/${PROJECT_ID}/uploads になります

レスポンスでアップロードしたファイルの URL が取得できます
今回は markdown で Wiki を編集するので markdown の値をそのまま使っています
JSON のパースには jq を使っているのでない場合はインストールしてください

{
  "alt": "dk",
  "url": "/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png",
  "full_path": "/namespace1/project1/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png",
  "markdown": "![dk](/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png)"
}

あとは前回同様 Wiki を編集する API をコールするだけです

最後に

あとは CI と組み合わせます

参考サイト

2021年11月2日火曜日

Gitlab の Wiki を API で編集する方法

Gitlab の Wiki を API で編集する方法

概要

Gitlab のプロジェクト配下の Wiki ページを API で編集するサンプルスクリプトを紹介します

環境

  • Gitlab 14.3.3-ee

サンプルスクリプト

#!/bin/bash

CONTENT="
# API Test Page

## List
* a
* b
* c
"
TITLE="test"
BODY="format=markdown&content=${CONTENT}&title=${TITLE}&slug=${TITLE}"

PROJECT_ID=123
HOST="https://gitlab.example.com/"
PATH="/api/v4/projects/${PROJECT_ID}/wikis/${TITLE}"
PRIVATE_TOKEN="xxxxxxxxxxxx"

/usr/bin/curl -XPUT "${HOST}${PATH}" \
    --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \
    --data "${BODY}"

解説

API のパスは /api/v4/projects/${PROJECT_ID}/wikis/${TITLE} になります

slug と TITLE は基本的に同じ値がいいとかなと思います
もしサブディレクトリに保存したい場合は slug をサブディレクトリ構成に変更してください

リクエストは JSON ではなく key/value パラメータとして送信します
format=markdown を指定しているので content はマークダウン形式で記載します

あとは各自の PROJECT_ID, HOST, PRIVATE_TOKEN を取得して設定すれば OK です

最後に

CI と組み合わせたり画像ファイルをアップロードする方法と組み合わせて使ってみたいので機会があれば試してみたいと思います

参考サイト

2021年11月1日月曜日

Python の diagrams を使ってサーバ構成図をコードで記述する

Python の diagrams を使ってサーバ構成図をコードで記述する

概要

パワポなどのツールだと構成図がバイナリになってしまい差分などを確認するのが大変です Python の diagrams であればコードで残せるので今回はインストールと簡単なサンプルを紹介します

環境

  • macOS 11.6
  • Python 3.8.3

インストール

  • pipenv install diagrams

サンプルコード

とりあえず動作させることができるサンプルコードがあるのでこれを動かしてみます

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Grouped Workers", show=False, direction="TB"):
    lb = ELB("lb")
    workers = [EC2("worker1"),
               EC2("worker2"),
               EC2("worker3"),
               EC2("worker4"),
               EC2("worker5")]
    db = RDS("events")
    lb >> workers >> db

動作確認

これで grouped_workers.png というファイルが作成されます

簡単な使い方の解説

with Diagram の引数で図のタイトルを設定します
show=True にすると自動でファイルを開きます
direction は矢印の向きで BT や LR などを指定できます
各種オプションは graphviz のオプションと同じなので指定可能なオプションは graphviz のドキュメントを見ると良いかなと思います

各種ノードは >> で結合することで矢印でつなぐことができます
結合方法は他に「<<」と「-」があります
ハイフンや矢印なしの接続になります

サンプルにはないですが Cluster を使うとその配下のノードを枠で囲うことができます
またクラスタは階層化することもできます

最後に

内部的には graphviz ですが Python で書けるので Python に慣れている人にはオススメです
サンプルでは AWS のアイコン集を使っていますが gcp や自分でカスタマイズすることもできます

参考サイト

2021年10月29日金曜日

iOS アプリのレビューを curl で取得する方法

iOS アプリのレビューを curl で取得する方法

概要

公開している iOS アプリにレビューが評価があっても通知されません

基本的には自分で定期的にチェックするしかありません
公開しているアプリであれば公式で評価とレビューを取得するためのフィードが準備されているのでそれを使うと楽です

XML と JSON のメディアタイプで取得できます

環境

  • macOS 11.6
  • フィード 2021/10/04 時点

アプリID の取得

App Store Connect などで取得できます

App Store Connect -> アプリ選択 -> 一般 -> App 情報 -> AppleID

URL にも表示されているのでそこから取得しても OK です

xml

1234567890 の部分は取得したアプリID に変更してください

json

1234567890 の部分は取得したアプリID に変更してください
json の場合は一番後ろのパスを json に変更するだけです

2021年10月28日木曜日

golang でパスワードの強度をチェックする方法

golang でパスワードの強度をチェックする方法

概要

hesahesa/pwdbro を使います

環境

  • macOS 11.6
  • golang 1.17

インストール

サンプルコード

package main

import (
	"fmt"
	"github.com/hesahesa/pwdbro"
)

func main() {
	pass := ""
	pwdbro := pwdbro.NewDefaultPwdBro()
	// パスワードの強度のチェック結果は status に配列で格納されています
	// pwnedpasswords と zxcvbn とパスワードが空かの 3 つのチェック方法の結果が格納されています
	status, err := pwdbro.RunChecks(pass)
	if err != nil {
		panic(err)
	}
	// 3 回ループします 
	for _, resp := range status {
		// Safe は true or false が返ってきます
		// true の場合はパスワードが強度チェックをパスしています 
		fmt.Println("*******************Safe")
		fmt.Println(resp.Safe)
		// Method は各パスワードのチェック方法が文字列で格納されています
		fmt.Println("*******************Method")
		fmt.Println(resp.Method)
		// Message は各パスワードチェックの結果が文字列で含まれています
		fmt.Println("*******************Message")
		fmt.Println(resp.Message)
		// Error はもしエラーだった場合に nil 以外のエラー情報が含まれています
		fmt.Println("*******************Error")
		fmt.Println(resp.Error)
	}
}

ポイント

pwnedpasswords というサービスの API を使っているのでオフラインだと pwnedpasswords の結果は必ず false になります

オフラインの場合は zxcvbn の結果を見て判断すると良いかなと思います