ローカルテストに利用している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 unknownDockerファイルを以下のように作製し、パッチを当てる
FROM openstackswift/saio:py3
RUN apk add --no-cache patch
COPY checksum.patch /tmp/
RUN patch -p0 < /tmp/checksum.patchdocker-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.0AIと協力して原因を調査した結果
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互換ストレージ)に置き換えても良いかもしれない