AWS CDK+Serverless Next.js構成で、APIからAWSリソースにアクセスできるようにIAMロールを更新する
AWSアドベントカレンダー / AWS Amplifyアドベントカレンダー / Next.jsアドベントカレンダー 9日目のクロスポストです。 Next.jsのAPIから、AWSのAPIを呼び出したい たとえば「外部サー […]
広告ここから
広告ここまで
目次
AWSアドベントカレンダー / AWS Amplifyアドベントカレンダー / Next.jsアドベントカレンダー 9日目のクロスポストです。
Next.jsのAPIから、AWSのAPIを呼び出したい
たとえば「外部サービスのAPI TokenをSystems Managerから取得したい」など、Next.jsのAPI処理内部でAWS APIを呼び出したくなるケースはいくつか存在します。
AWS CDKでデプロイしている場合には、Constructを上書きすることで更新できます。
コードサンプル
const app = new NextJSLambdaEdge(this, "NextJsApp", {
serverlessBuildOutDir: "./build",
});
const targets = [app.defaultNextLambda, app.nextApiLambda];
targets.forEach((target) => {
target.addToRolePolicy(
new PolicyStatement({
resources: ["*"],
actions: ["ssm:GetParameter"],
})
);
});
コード概説
AWS CDKでServerless Next.jsを利用する場合、NextJSLambdaEdge
コンストラクタを利用します。そしてこの中には、デプロイするLambda@Edgeのリソースが含まれています。
APIやgetServerSiteProps
などを実行するLambda@edgeのリソースがわかれば、あとはそれに対してaddToRolePolicy
を実行してIAMポリシーを追加してやればOKです。
対象となるLambda@edgeのattribute名
addToRolePolicy
がforEach内で実装されているのは、設定が必要なFunctionが複数あったためです。
- defaultNextLambda
- nextApiLambda
- nextImageLambda
next/imageでAWS APIを叩くことはあまりない気がしますので、上の2つに必要に応じて設定する方法で良いかとは思います。