-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserverless.yml
More file actions
58 lines (53 loc) · 2.81 KB
/
Copy pathserverless.yml
File metadata and controls
58 lines (53 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
service: github-notifications-slack
plugins:
- serverless-plugin-scripts
custom:
defaultStage: dev
scripts:
hooks:
# 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 でビルドする。
#
# 完全静的リンクには OpenSSL/zlib/libevent の静的ライブラリ(.a)が必要。
# 現行イメージには同梱されているが、将来イメージから外れてもリンクエラー
# (cannot find -lssl 等)にならないよう apk add で明示的に導入しておく。
#
# chmod はコンテナ内(root)で実行する。Linux ランナーでは生成物が
# root 所有になり、コンテナ外の runner ユーザーでは chmod できないため。
#
# イメージのタグは latest ではなくバージョンで固定する。latest のままだと
# Crystal の更新で、CI(ci.yml)が検証したのと違うコンパイラで本番成果物が
# 作られてしまい、互換性が壊れた場合は deploy も突然失敗する。
# ci.yml の crystal バージョンと揃えて上げること(issue #108)。
'before:package:createDeploymentArtifacts': |
docker run --rm --platform linux/arm64 -v "$PWD":/work -w /work crystallang/crystal:1.21.0-alpine \
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
runtime: provided.al2023
architecture: arm64
timeout: 300
region: ap-northeast-1
stage: ${opt:stage, self:custom.defaultStage}
environment:
${file(./env.yml)}
package:
patterns:
- '!./**'
- bootstrap
functions:
github_notifications_slack:
# provided ランタイムは実体としてパッケージ直下の bootstrap を実行する。
# この handler 文字列は _HANDLER として渡され、src/main.cr の
# Serverless::Lambda.handler "github_notifications_slack" と一致させる必要がある。
handler: github_notifications_slack
events:
- schedule: rate(1 minute)