From 7e72c6d22ae1a912acb7e3946d4f6031b23f3ee6 Mon Sep 17 00:00:00 2001 From: kairox Date: Sun, 28 Jun 2026 13:16:48 +0900 Subject: [PATCH 1/2] fix: build static binary with musl (Alpine) to restore outbound HTTPS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit glibc を静的リンクしたバイナリは provided.al2023 上で外部 HTTPS が失敗し (OpenSSL の STORE 初期化エラー)、api.github.com / hooks.slack.com への通信が 一切できず、通知もエラーアラートも送れず無言で停止していた。 ビルドのベースイメージを crystallang/crystal:latest から crystallang/crystal:latest-alpine (musl) に変更する。amazonlinux:2023 上で glibc 静的=失敗 / musl 静的=成功 を再現確認済み。 Co-Authored-By: Claude Opus 4.8 (1M context) --- serverless.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/serverless.yml b/serverless.yml index d49b389..b417543 100644 --- a/serverless.yml +++ b/serverless.yml @@ -10,10 +10,18 @@ custom: # sls deploy / sls package 時に bootstrap を静的ビルドする。 # macOS / Apple Silicon でも Lambda(provided.al2023, arm64) 互換の # 静的バイナリを得るため、linux/arm64 を明示して Docker でビルドする。 + # + # ベースイメージは musl の Alpine(crystallang/crystal:*-alpine) を使う。 + # glibc を静的リンク(--link-flags -static)したバイナリは provided.al2023 + # 上で外部 HTTPS が失敗し(OpenSSL の STORE 初期化エラー等)、 + # api.github.com / hooks.slack.com への通信が一切できず通知を送れなくなる。 + # amazonlinux:2023 上で再現確認済み: glibc 静的=失敗 / musl 静的=成功。 + # musl は完全な静的バイナリでも外部通信が動くため Alpine でビルドする。 + # # chmod はコンテナ内(root)で実行する。Linux ランナーでは生成物が # root 所有になり、コンテナ外の runner ユーザーでは chmod できないため。 'before:package:createDeploymentArtifacts': | - docker run --rm --platform linux/arm64 -v "$PWD":/work -w /work crystallang/crystal:latest \ + docker run --rm --platform linux/arm64 -v "$PWD":/work -w /work crystallang/crystal:latest-alpine \ sh -c "crystal build --link-flags -static -o bootstrap src/main.cr && chmod +x bootstrap" provider: From 0131f141425fb393d4f30e4cb3577e3ad81cde54 Mon Sep 17 00:00:00 2001 From: kairox Date: Sun, 28 Jun 2026 14:32:18 +0900 Subject: [PATCH 2/2] =?UTF-8?q?chore:=20=E9=9D=99=E7=9A=84=E3=83=AA?= =?UTF-8?q?=E3=83=B3=E3=82=AF=E7=94=A8=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9?= =?UTF-8?q?=E3=83=AA=E3=82=92=20apk=20add=20=E3=81=A7=E6=98=8E=E7=A4=BA?= =?UTF-8?q?=E5=B0=8E=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完全静的リンクに必要な OpenSSL/zlib/libevent の静的ライブラリ(.a)を ビルド前に明示インストールし、将来イメージから外れてもリンクエラーに ならないよう堅牢化する(PR #89 レビュー指摘対応)。 Co-Authored-By: Claude Opus 4.8 (1M context) --- serverless.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/serverless.yml b/serverless.yml index b417543..4757899 100644 --- a/serverless.yml +++ b/serverless.yml @@ -18,11 +18,15 @@ custom: # amazonlinux:2023 上で再現確認済み: glibc 静的=失敗 / musl 静的=成功。 # musl は完全な静的バイナリでも外部通信が動くため Alpine でビルドする。 # + # 完全静的リンクには OpenSSL/zlib/libevent の静的ライブラリ(.a)が必要。 + # 現行イメージには同梱されているが、将来イメージから外れてもリンクエラー + # (cannot find -lssl 等)にならないよう apk add で明示的に導入しておく。 + # # chmod はコンテナ内(root)で実行する。Linux ランナーでは生成物が # root 所有になり、コンテナ外の runner ユーザーでは chmod できないため。 'before:package:createDeploymentArtifacts': | docker run --rm --platform linux/arm64 -v "$PWD":/work -w /work crystallang/crystal:latest-alpine \ - sh -c "crystal build --link-flags -static -o bootstrap src/main.cr && chmod +x bootstrap" + sh -c "apk add --no-cache openssl-libs-static zlib-static libevent-static && crystal build --link-flags -static -o bootstrap src/main.cr && chmod +x bootstrap" provider: name: aws