AstroをSSRでCloudflare Pagesにデプロイしたい
ハマったところメモ
[解決] microCMSのビルドエラー
error parameter is required (check serviceDomain and apiKey)
APIクライアント作成時の処理をこんな感じにしてビルドエラーを回避してみた。
import { getRuntime } from "@astrojs/cloudflare/runtime";
import { createClient } from "microcms-js-sdk";
import type { MicroCMSClient } from "./types";
/**
* @see https://discord.com/channels/1074874430485958716/1075435519300870244/1100981542660079646
*/
export const createCFMicroCMSClient = (request: Request):MicroCMSClient => {
const runtime = getRuntime(request)
if (runtime && runtime.env) {
const cfRuntimeAPIKEY = (runtime.env as any).MICROCMS_API_KEY as string
if (cfRuntimeAPIKEY) {
return createClient({
serviceDomain: 'hidetaka',
apiKey: cfRuntimeAPIKEY,
})
}
}
const envAPIKEY = import.meta.env.MICROCMS_API_KEY
if (envAPIKEY) {
return createClient({
serviceDomain: 'hidetaka',
apiKey: import.meta.env.MICROCMS_API_KEY as string,
})
}
console.log({
message: "Failed to load the microcms API keys"
})
return {
async get(props) {
if (props.contentId) {
return {}
}
return {
contents: []
}
}
} as MicroCMSClient
}
SSRでは動くので、ビルド時の環境変数読み込みに何かがありそう。
- Astro SSG Mode: import.meta.env.MICROCMS_API_KEYでAPIキーを取得できる
- Astro SSR Mode: import.meta.env.MICROCMS_API_KEYがundefinedになる
astro.config.mjsのこの2行を追加した以外は同じ条件なので、
Astroのビルド周りを調べることになりそう。
output: "server",
adapter: cloudflare()
server
モードで起動するなら、特定のページだけprerenderでビルドしておくみたいなことは無理っぽいかなぁ
Discordでいろいろ議論した結果「AstroもといViteのビルド挙動まわりを見るべきだ」となった。
Viteなら.env
ファイルを配置すれば読むはずなので、GitHub Actionsを次のようにしてみたところ、動いた様子。
jobs:
deploy:
runs-on: ubuntu-latest
name: Deploy
steps:
- uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16
cache: yarn
- name: Install
shell: "bash"
run: yarn install
- name: Env
shell: bash
run: |
echo "MICROCMS_API_KEY=${{ secrets.MICROCMS_API_KEY }}" > .env
- name: Build
shell: "bash"
run: |
yarn run build
Could not resolve "http"
[解決] 14:12:32.577 ✘ [ERROR] Could not resolve "http"
14:12:32.577
14:12:32.578 node_modules/rss-parser/lib/parser.js:2:21:
14:12:32.578 2 │ const http = require('http');
14:12:32.578 ╵ ~~~~~~
14:12:32.578
rss-parser
をfast-xml-parser
に変更して解決。
fast-xml-parser
はfetchしないので、こうなる。
const parser = new XMLParser()
const response = await fetch(url)
const feedData = await response.text()
const parsedItem = parser.parse(feedData)
[未解決 | 原因不明] なぜかdev.toのAPIへのfetchがこける
wrangler paged dev ./dist
とデプロイ先だけ落ちてた。
astro dev
は動く不思議。
仕方ないので、RSSフィードを読ませる形に変更して対応。
RSSでも事故るんだかなんでだ?
2023/06/16
dev.toのデータを取得できないのが致命的なので、ロールバック。
SSGモードで運用を再開。
2023/06/16 23:00
GitHub Actionsで環境変数を.env
に展開してからビルドしたら割とどうにかなった。
dev.toへのアクセスが落ちる理由はわからないけど、そもそもそんなに記事書いてないからまぁいいやってことに
・export const prerender = trueを設定してSSGモードにしたページへのアクセスはFunctionsのログに残らない
・SSRモードに設定したページはFunctionsのログに表示されている
なので、なんとかAstro Hybrid rendering (with microCMS)への切り替えに成功した様子。
とりあえずこれでいこう。
dev.toについては、HonoかPicoあたりをWorkersに乗せて試して、切り分けをやってからにする。
最悪・・・ここだけ間にAWS lambdaでも噛ませりゃいいしw