AWS CDK+Serverless Next.js構成で、APIからAWSリソースにアクセスできるようにIAMロールを更新する

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が複数あったためです。

参考: https://github.com/serverless-nextjs/serverless-next.js/blob/master/packages/serverless-components/nextjs-cdk-construct/src/index.ts#L55-L59

  • defaultNextLambda
  • nextApiLambda
  • nextImageLambda

next/imageでAWS APIを叩くことはあまりない気がしますので、上の2つに必要に応じて設定する方法で良いかとは思います。

Comment