AWS Application Composer を利用して SAM アプリをサクッと構築
はじめに
最近、散歩がマイブームになりつつある sekky です。
これまで業務で SAM を扱う機会がほぼなく、自学でも主に serverless framework や serverless stack を利用していたため、Application Composer が出た当初はあまり注目していませんでした。
機会があり調査したところ思った以上に便利だったので紹介します。
Application Composer とは
AWS が提供するサーバレスアプリケーションを視覚的に設計するためのツールです。
使い始めてみる
今回は VSCode から利用します。そのため、拡張機能の AWS Toolkit を導入します。
まずはコマンドパレットから AWS: Create Lambda SAM Application を利用してプロジェクトを作成し、開きます。
今回は go 1.x(Image) を利用して作成しました。
作成した時点で、既に template.yaml 等も含め、そのままデプロイすれば動く状態のアプリができています。
template.yaml を開くともう右上に Application Composer のボタンが居ます。
これを押してみると・・・
Application Composer が開きます!
もう少し触ってみる
シンプルな API Gateway + Lambda(コンテナ) + Dynamo DB の形を作ってみます。
今回はほぼ Application Composer で設定してみます。(Dockerfile 用の Metadata 周りは Application Composer では設定できないため、手作業で編集しました)
肝心の Lambda は go言語 + fiberを利用したWebサーバとして作成し、以前の私の記事で紹介した AWS Lambda Web Adapter を利用して Docker イメージ化しています。
FROM golang:1.22-alpine as builder
RUN apk update && apk add --no-cache ca-certificates && update-ca-certificates
WORKDIR /app
COPY . .
RUN GOPROXY=https://goproxy.cn GOARCH=arm64 GOOS=linux CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o ./bootstrap ./main.go
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /app/bootstrap /bootstrap
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.1 /lambda-adapter /opt/extensions/lambda-adapter
ENV PORT=8000
EXPOSE 8000
ENTRYPOINT [ "/bootstrap" ]
あとは、sam deploy でデプロイするだけでサクッと Web API が構築できます。
良いと思った点
- SAM テンプレートを(全てではないけど)自前で書かなくて良い
- パレットからリソースを追加すれば SAM テンプレートに追記される
- 線を繋げば必要なリソース間の関係やポリシーがSAMテンプレートに追記される
- API Gateway → Lambda を繋げば Lambda の Events が追記される
- Lambda → DynamoDB を繋げば必要なポリシーが追記される
- リソースの Details からある程度のリソースの設定ができる
- 既存の SAM テンプレートを視覚的に表示できる
- openapi.yml を用いた API Gateway の設定ができる
- StepFunctions ステートマシンの Workflow Studio も含まれており、StepFunctions で利用する Lambda も Application Composer で線を接続するだけで構築できる
ちょっとイマイチな点
- 実際は繋ぐことができるが Application Composer 上で繋げられないことがある
- EventBridge → SNS など
- 細かい設定ができない
- API Gateway と線を繋いだ際、Lambda の Events が Api になってしまう。
- HttpApi に変えたい場合は手作業でテンプレートの編集が必要
- リソースの Details はリソース設定の一部が行えるものであるため、細かいパラメータは自分で調査してテンプレートに追加する必要がある
- API Gateway と線を繋いだ際、Lambda の Events が Api になってしまう。
- template.yaml の Globals を参照してくれない
- Lambda の設定などは Globals を参照してくれないため、共通する項目も各 Lambda に設定する形になる
- template.yaml を手作業で編集した際に、不整合があると Application Composer 自体が開けなくなる
- まれに、Application Composer で Save した情報が template.yaml に反映されないことがある
最後に
良い点、イマイチな点ありながらも、視覚的に設計できるという点で設計のハードルが大きく下がり、簡単にアプリの構築ができるのは大きなメリットだなと感じました。
複雑な設定を必要としないのであれば Application Composer で十分に設定でき、あとは Lambda 等のプログラムコードを記載してデプロイするだけになるので、シンプルなアプリを素早く構築するのに向いていると思います。
更に AWS SAM Pipeline を組み合わせれば CI/CD も容易に構築できるため、作りたいと思ったものをサクッと作れます。