2026年4月6日月曜日

Dockerfile の RUN では --mount を使おう

Dockerfile の RUN では --mount を使おう

概要

ビルドを高速化しましょう

環境

  • macOS 26.3.1
  • docker 29.3.1

FROM python:3.12.11-alpine3.21

# 必要なパッケージをインストール
RUN apk add --no-cache nodejs npm

COPY . /home
WORKDIR /home

RUN pip install pipenv
RUN pipenv install

ENV REDIS_HOST=redis

# ミニファイ用ツールをインストール
RUN npm install -g clean-css-cli uglify-js

# CSS / JS をミニファイ
RUN uglifyjs static/js/fontawesome-all.min.js -o static/js/fontawesome-all.min.js
RUN cleancss -o static/css/footer.css static/css/footer.css

CMD ["pipenv", "run", "gunicorn", "-w", "1", "-b", "0.0.0.0:8080", "app:app"]

# syntax=docker/dockerfile:1.7

FROM python:3.12.11-alpine3.21

# 必要なパッケージ
RUN apk add --no-cache nodejs npm

WORKDIR /home

# -------------------------
# ① 依存関係だけ先にコピー(キャッシュ効かせる)
# -------------------------
COPY Pipfile Pipfile.lock ./

# pipenv + cache mount
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install pipenv && \
    pipenv install --deploy --system

# -------------------------
# ② npmツール(キャッシュ効かせる)
# -------------------------
RUN --mount=type=cache,target=/root/.npm \
    npm install -g clean-css-cli uglify-js

# -------------------------
# ③ アプリ本体(最後にコピー)
# -------------------------
COPY . .

ENV REDIS_HOST=redis

# -------------------------
# ④ minify(tmpfsで高速化&不要データ残さない)
# -------------------------
RUN --mount=type=tmpfs,target=/tmp \
    uglifyjs static/js/fontawesome-all.min.js -o static/js/fontawesome-all.min.js && \
    cleancss -o static/css/footer.css static/css/footer.css

CMD ["gunicorn", "-w", "1", "-b", "0.0.0.0:8080", "app:app"]

最後に

今回はライブラリのインストールなどに使いましたが一時的な認証情報を渡すときにも使えます

2026年3月29日日曜日

sshd でチャレンジレスポンス認証を試す

sshd でチャレンジレスポンス認証を試す

概要

前回 Ubuntu + pam の設定を行いました

チャレンジレスポンス認証は通常のパスワード認証と毎回違うパスワードで ssh ログインさせたりすることができます
OTP や外部の認証サーバと連携したりもできます

今回は簡単な問題をシェルスクリプトで作成しその問題が正解なら認証 OK とします

環境

  • macOS 26.3.1
  • docker 29.3.0
    • Ubuntu 24.04

pam.d/ssh

# --- Auth Phase ---
# 1. クイズを表示
auth       required     pam_echo.so info Challenge: 3 + 5 = ?

# 2. スクリプト判定(8 以外ならここで拒否される)
auth       required     pam_exec.so expose_authtok /usr/local/bin/math_challenge.sh

# 3. 資格情報 (setcred) を与えるためのモジュール
# 前のステップが required なので、ここには「8」と打った時しか到達しません。
# これを入れることで pam_setcred(): Permission denied を防ぎます。
auth       required     pam_permit.so


# --- Account & Session Phase ---
account    required     pam_permit.so

session    required     pam_unix.so
session    required     pam_env.so
# session  required     pam_loginuid.so  # Dockerでは引き続きコメントアウト

math_challenge.sh

#!/bin/bash
# 入力を読み取る
read -r USER_INPUT

# 判定(xargsで空白を除去)
ANSWER=$(echo "$USER_INPUT" | xargs)

if [ "$ANSWER" = "8" ]; then
    # 成功時は何も出力せず exit 0
    exit 0
else
    # 失敗時はデバッグ用に標準エラーへ(docker logsで見れる)
    echo "Auth Failed: Input was '$ANSWER'" >&2
    exit 1
fi

Dockerfile

FROM ubuntu:24.04

RUN apt-get update && \
    apt-get install -y openssh-server && \
    mkdir /var/run/sshd

# ユーザー作成
RUN useradd -m -s /bin/bash testuser && echo "testuser:testpass" | chpasswd

# 既存設定をリセットし、必要な設定だけを新規作成
RUN rm -rf /etc/ssh/sshd_config.d/* && \
    echo "Port 22" > /etc/ssh/sshd_config && \
    echo "ListenAddress 0.0.0.0" >> /etc/ssh/sshd_config && \
    echo "PermitRootLogin no" >> /etc/ssh/sshd_config && \
    echo "KbdInteractiveAuthentication yes" >> /etc/ssh/sshd_config && \
    echo "PasswordAuthentication no" >> /etc/ssh/sshd_config && \
    echo "UsePAM yes" >> /etc/ssh/sshd_config

# 認証スクリプトをコピー
COPY math_challenge.sh /usr/local/bin/math_challenge.sh
RUN chmod +x /usr/local/bin/math_challenge.sh

# PAM設定を上書き
COPY pam.d/sshd /etc/pam.d/sshd

# (重要) CHALLENGE-RESPONSEを有効化
RUN sed -i 's/KbdInteractiveAuthentication no/KbdInteractiveAuthentication yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D", "-e"]

compose.yaml

services:
  ssh:
    build: .
    container_name: ssh-challenge
    ports:
      - "2222:22"

動作確認

  • docker compose up -d --build
  • ssh -o PreferredAuthentications=keyboard-interactive testuser@localhost -p 2222

これで「8」と入力すればログインできるようになります
それ以外はログインエラーになります
さすがにチャレンジするパスワードが簡単すぎるので本当はもっと複雑な問題にします

最後に

Ubuntu24.04 でチャレンジレスポンス認証を試してみました
pam と連携することでより複雑なチャレンジレスポンス認証が実装できます

あとはこのスクリプトをより改良して外部の認証機構と連携したりすることができます

2026年3月28日土曜日

Ubuntu で pam 認証を有効にする

Ubuntu で pam 認証を有効にする

概要

PAM (Pluggable Authentication Modules) は通常の sshd 認証と違い外部の認証機構などを使って認証する仕組みです
sshd と組み合わせることで OTP などを実現できます
今回は Ubuntu 24.04 で pam を設定する方法を紹介します

環境

  • macOS 26.3.1
  • docker 29.3.0
    • Ubuntu 24.04

pam.d/sshd

# PAM構成の基本
auth       required     pam_unix.so nullok_secure
account    required     pam_unix.so
session    required     pam_unix.so
session    required     pam_loginuid.so

Dockerfile

FROM ubuntu:24.04

RUN apt-get update && \
    apt-get install -y openssh-server && \
    mkdir /var/run/sshd

# ユーザー作成
RUN useradd -m -s /bin/bash testuser && echo "testuser:testpass" | chpasswd

# 既存設定をリセットし、必要な設定だけを新規作成
RUN rm -rf /etc/ssh/sshd_config.d/* && \
    echo "Port 22" > /etc/ssh/sshd_config && \
    echo "ListenAddress 0.0.0.0" >> /etc/ssh/sshd_config && \
    echo "PermitRootLogin no" >> /etc/ssh/sshd_config && \
    echo "KbdInteractiveAuthentication yes" >> /etc/ssh/sshd_config && \
    echo "PasswordAuthentication no" >> /etc/ssh/sshd_config && \
    echo "UsePAM yes" >> /etc/ssh/sshd_config

# PAM設定コピー
COPY pam.d/sshd /etc/pam.d/sshd

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

compose.yaml

services:
  ssh:
    build: .
    container_name: ssh-challenge
    ports:
      - "2222:22"

動作確認

  • docker compose up -d --build
  • ssh -o PreferredAuthentications=keyboard-interactive testuser@localhost -p 2222

最後に

Ubuntu24.04 の sshd の場合設定が少し特殊なので注意しましょう
基本はデフォルトを削除し新規に作成するのが確実です

次回は pam を使ってチャレンジレスポンス認証を試します

2026年3月17日火曜日

AWS Certified Solutions Architect - Associate 03 合格メモ

AWS Certified Solutions Architect - Associate 03 合格メモ

概要

一応残しておきます
GCP の ACE に比べて難しい印象です

環境

  • AWS SAA (03) (2026/03/16時点)
  • テストセンターにて受験

料金

  • 150ドル (約20,000円)

対策

完全に過去問ゲーというわけにはいかない感じです
過去問からそのまま採用されるケースはほぼない印象です

教科書

kindle で 0 円だったのでこれにしましたが他のやつの方がいいかもです

模擬試験

全部で804問です

解き方のポイント

  • 時間がかなり無い印象
    • 自分は時間ギリギリまで使った
    • わからない問題は飛ばすか適当に回答もあり
  • 15問はダミー
    • これがよくわからない
    • 正解でも誤答でも無関係らしい
    • しかもどれかわからない
    • これがあるから先程の適当回答も時間がなければワンチャンありという感じ
  • 過去問がそのまま出るケースはほぼなかった
    • 模擬試験を暗記していれば回答先読みで即回答が使えるが SAA03 はほぼできなさそう
    • 模擬試験と全く同じ問題はなかったが同じようなやつで回答項目が違ったり問題を少しひねったやつは出てくる
    • 全体的に意地悪な問題が多かった印象
  • 問題の日本語がおかしい
    • 説明が少なすぎて頭で補完しなければならない
    • これを実現するためにこのコンポーネントが足りないがそれは使う前提になっていたりとか
    • このケースは実はコストも関係しているから暗黙的に安いものを選択するとか
  • 実務関係なく考えななければならない
    • これは GCP も同様だった
    • 資格モードにならないとダメ
  • 消去法
    • これは結構使えるかもしれない
    • 明らかに違うだろうというやつが何個かあったので2択まで絞れる問題が多かった印象

実際に出題された問題の記憶

  • NoETL
  • LakeFormation + 認証
  • NATゲートウェイの固定IP化
  • DR関連の問題 (これが結構多かった)
  • 最適な構成の問題 (これも結構多かった)
  • STS + DMS + コードの内のSQL変換方法
  • Global Accelerator
  • AI 関連 (Comprehend, Rekognition, SageMaker など)

全体的にいやらしい問題が多かった印象です
単純な EC2 や EBS の構成の問題は少なかったです

スコアレポートはでない

詳細なのは出ませんが点数などの結果は certmetrics で確認できます
ちなみに試験後画面ですぐに出たりすることはないので合否もスコアレポートも後で確認になります

暫定合格を確認する方法もない

ないです

合否通知はいつくるか

当日は20時50分くらいに certmetrics にログインしたら合格結果が出ていました
ちなみにバッジでおなじみの credly からのメールは 21時50分くらいに来ていました

最後に

GCP に比べると難しい印象でした
ただ GCP に比べて結果がその日に出るのは嬉しいです
GCP は結果が出るまでに数日かかるのでイライラします

模擬試験ゲーというわけにもいかないので実務 or 教科書による各種サービスの詳細な仕様までわかっていたほうがいいです
しかも基本的なサービスと言うよりかはわりとニッチなサービスも知っておく必要がありそうです

2026年2月26日木曜日

stable-diffusion で新しいモデルを追加し古いモデルを削除した場合はキャッシュも削除しなければいけないっぽい

stable-diffusion で新しいモデルを追加し古いモデルを削除した場合はキャッシュも削除しなければいけないっぽい

概要

そうしないと古いモデルを参照し続けてしまうっぽい

環境

  • macOS 26.3

現象

waiNSFWIllustrious_v140.safetensors を models/Stable-diffusion から削除したが API 経由でなぜか参照する事案が発生

ログ

Checkpoint waiNSFWIllustrious_v140.safetensors not found; loading fallback waiIllustriousSDXL_v160.safetensors [a5f58eb1c3]

対処方法

一旦 webui.sh を停止します
そして以下のキャッシュを削除します

  • rm cache/hashes/cache.db
  • rm cache/safetensors-metadata/cache.db

画像にもモデル情報が含まれているケースがあるので削除します

  • rm -rf outputs/txt2img-images/2025-09-30/*

これで再度 webui.sh を起動しましょう
ログが出ていなければ OK です

最後に

モデルを削除するだけではダメらしい

2026年2月22日日曜日

npm でパッケージをアップグレードする方法

npm でパッケージをアップグレードする方法

概要

いちいち package.json を編集するのは面倒です

環境

  • macOS 26.3
  • nodejs 22.21.0

方法

  • npx npm-check-updates -u
  • npm install

最後に

outdated とか使う方法があるらしいですがややこしいのでそういうのをまとめてやってくれる npm-check-updates を使うのが簡単です

参考サイト

2026年2月16日月曜日

Github actions で kitchen test をする場合は buildkit を無効にしなければ動かなくなった

Github actions で kitchen test をする場合は buildkit を無効にしなければ動かなくなった

概要

おそらく本当に最近仕様変更があった模様

環境

  • Github actions (2026/02/13時点)
  • Ruby 4.0.1
    • test-kitchen 3.9.1
    • kitchen-docker 3.0.0

Github actions の設定

name: Kitchen test

on:
  push:
    branches:
      - "master"

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        with:
          platforms: linux/arm64

      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Install dependencies
        run: bundle install

      - name: Run Test Kitchen
        run: |
          bundle exec kitchen test
        env:
          CHEF_LICENSE: accept
          DOCKER_BUILDKIT: 0

デバッグログを表示する場合

name: Kitchen test

on:
  push:
    branches:
      - "master"

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        with:
          platforms: linux/arm64

      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Install dependencies
        run: bundle install

      - name: Run Test Kitchen
        run: |
          bundle exec kitchen test --log-level debug || true
        env:
          CHEF_LICENSE: accept
          DOCKER_BUILDKIT: 0

      - name: Show Kitchen logs
        if: always()
        run: |
          echo "===== kitchen.log ====="
          cat .kitchen/logs/kitchen.log || true
          echo "===== instance log ====="
          cat .kitchen/logs/default-ubuntu-2204.log || true

最後に

内部的に buildkit を使うようになっており docker の出力形式が変更されたために起きていたエラーでした