個人的なWebアプリを作成するためにAmplifyを触ってみました。AmplifyはGCPで言うFirebase的なサービスです。個人的にはFirebaseのほうが全然イケてますが、AWSにまずは触ってみたいということで。

どうやらこのサービス、Gen1とGen2があって相当破壊的な変更が行われてるらしい。日本語ドキュメントにはamplifyコマンドが散見されますが、そもそもampxコマンドなので注意が必要。

そしてデプロイが超絶に遅いです。金をむしり取ろうとする気満々である。早速かかっています。 「ただのReactプロジェクト」でも平気で10分はかかる模様。 まだまだ使ってみないとわかりませんが、とは言えサーバレスはEC2やAppRunを維持するよりは安めになるハズ(?)です。
リアルな話、私の今回目指してる規模感(小さい)で開発フェーズで2~4000円、維持フェーズで1000円くらいになるのかな?わからないけど。クラウドはやっぱ金がかかるね…

恐らく課金要素としてはAmplifyのビルドが一番大きく、試行錯誤して開発でビルドしまくるとガンガン金がかさむ可能性大。ラムダやDBとか認証周りは比較的アクセス頻度とデータ量を押さえれば安く出来そう。

ラムダのシークレットとサードパーティライブラリの使い方。 肝になるのはresource.tsで、これにlayersenvironmentを設定する必要がある。

ラムダで外部パッケージを使うには、node_moudlesフォルダをコピーして入れたnodejsフォルダのzipをアップロードしたレイヤを作成し(この際にNode.jsに対応するようチェックする)、そのIDを貼り付ければ良い。

なお、注意点としてプロジェクトは完全にnpmを使うべきっぽい。フロント層の静的サイトを作るだけならpnpmは使えなくもないですが、バックエンド周りなどが見事にバグりまくりで困りました。

import { defineFunction, secret } from "@aws-amplify/backend";

export const sayHello = defineFunction({
  name: "say-hello",
  entry: "./handler.ts",
  layers: {
    lodash: "arn:aws:lambda:ap-northeast-xxxxxxxxxxxxxxx:layer:lodash:1",
  },
  environment: {
    FOO: secret("FOO"),
  },
});

以下のハンドラを作ったら普通に呼べた。

import type { Schema } from "../../data/resource";
import { env } from "$amplify/env/say-hello";
import _ from "lodash";

export const handler: Schema["sayHello"]["functionHandler"] = async (
  event,
  context
) => {
  const { name } = event.arguments;
  const sum = _.sum([1, 2, 3]);
  return {
    statusCode: 200,
    message: `Hello ${env?.FOO} from ${name}!`,
    sum: sum,
  };
};

最近はサーバーコンポーネントとかが流行っていますが、基本はこれらを叩くにはフロント側からのほうがバグりにくいと思います。