You are currently viewing ローカル環境のSwift壊れる

ローカル環境のSwift壊れる

ローカルテストに利用しているsaio(Swift All In One)が接続できなくなったのでAIといっしょに調査と対策を行ったときのメモ

先に結論

Docker Desctop(Docker Engine?)のバージョンアップにより、saio内で利用されているシステムコールの一部が利用できなくなった可能性があり、それが原因で起動できなくなった

対処方法

saioコンテナ内の以下のソースを修正するためのパッチファイルを作成
/opt/swift/swift/common/utils/checksum.py

--- /opt/swift/swift/common/utils/checksum.py.orig
+++ /opt/swift/swift/common/utils/checksum.py
@@ -100,8 +100,11 @@
 # The kernel may also provide crc32c
 AF_ALG = getattr(socket, 'AF_ALG', 38)
 try:
-    _sock = socket.socket(AF_ALG, socket.SOCK_SEQPACKET)
-    _sock.bind(("hash", "crc32c"))
+    try:
+        _sock = socket.socket(AF_ALG, socket.SOCK_SEQPACKET)
+        _sock.bind(("hash", "crc32c"))
+    except PermissionError:
+        _sock = None
 except OSError as e:
     if e.errno == errno.ENOENT:
         # could create socket, but crc32c is unknown

Dockerファイルを以下のように作製し、パッチを当てる

FROM openstackswift/saio:py3
RUN apk add --no-cache patch
COPY checksum.patch /tmp/
RUN patch -p0 < /tmp/checksum.patch

docker-composeファイルは以下のような感じです

services:
  swift:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: swift
    ports:
      - "8080:8080"
    environment:
      SWIFT_USER: "admin:admin"
      SWIFT_KEY: "admin"
      SWIFT_AUTH_URL: "http://localhost:8080/auth/v1.0"
      TZ: Asia/Tokyo
    volumes:
      - swift-data-local:/srv/node
volumes:
  swift-data-local:

docker-compose up -dでコンテナ起動後、コンテナ内で以下のコマンドを実施

# swift-init proxy-server stop
# ps aux | grep proxy
# pkill -f swift-proxy-server
# swift-init proxy-server start

ホストマシンで以下を実行し、トークンが返却されればOK

curl -i -H "X-Auth-User: admin:admin" -H "X-Auth-Key: admin" http://localhost:8080/auth/v1.0

AIと協力して原因を調査した結果

saioのコンテナ内でswift-proxy-serverをフォアグラウンドで実行することでエラーを確認できた

swift-proxy-server /etc/swift/proxy-server.conf

フォアグラウンドのログに「PermissionError: [Errno 1] Operation not permitted」が表示されたため権限系のエラーと判断

AIにログ解析をお願いしたら、/opt/swift/swift/common/utils/checksum.pyの以下の処理でエラーが発生していることが判明

AF_ALG = getattr(socket, 'AF_ALG', 38)

AF_FLGというSwift が Linux Kernel Crypto API (AF_ALG) を利用しようとしていた。
ただし Docker Desktop(macOS) 側の seccomp / capability 制限により、AF_ALG socket 作成が拒否されたのではということだった

対応としては上に示した通り、AL_FLGが利用できない場合はnoneを設定して利用しような設定とした
AL_FLGは高速化のために利用しているようで、利用できなくても処理自体は問題ないそうだ(AIの見解で、未検証)

今後の対応

一旦動くようになったとはいえ、これを機にAPIをS3互換に切り替えて、ストレージもMinIO(S3互換ストレージ)に置き換えても良いかもしれない

コメントを残す