lambda関数からAppSync API叩く際のIAMによる認可処理
前提
AppSyncの認証・認可にはいくつか方法があって選択できるようになっている
今作ってるアプリ内で lambda ないからしか叩かない API (subscriptionを発火させるためのmutateのapi) があるので、そのオペレーションだけ AWS_IAM を使って認証・認可を実装したい
lambda関数はGolangで実装する
CDK使って実装する
実行ロールの設定側
AppSync APIの認証・認可設定について
CDK
上記資料参考にdefaultAuthorization, additionalAuthoriztionModes を設定する
defaultをIAMに設定し、additionalの方にAPI_KEYを設定する
基本的に狭い方をデフォルトにして取りこぼしがないように
GraphQLスキーマ
オペレーションやフィールドごとにディレクティブを付与して、認証・認可の設定を変えられる
今回は Query や SubScription系は @aws_api_key, Mutateは @aws_iam を付与し、typeはどちらでも使えるように両方のディレクティブを設定する
今回はやらなかったけど、例えばある type の特定のフィールドのアクセスには IAM 認証が必要だから @aws_iam つけるとかかなりきめ細かい設定ができる模様
Lambdaからの実行ロール
CDK
上記の資料のようにLambdaからAppSyncのAPIを叩くための実行ロールをLambdaに付与してやる
最終的に types/Mutation/fields/updateExample のターゲットリソース(API)に対して appsync:GraphQL の権限が付与できる形になっていればよい
CDKから設定する場合は、ターゲットの実行ロールを GraphqlApi#grant に渡してやってアクセス許可が付与できればよい
IamResource.custom でもいいし、IamResouce.ofType による設定とかでも良さげ
クセス許可を付与したいlambda関数のrole(実行ロール)を GraphqlApi#grant を渡してやることで、無事付与できた
lambda関数内からAppSyncへリクエストを投げる処理
GoでIAM認証通しながらAppsyncを叩くサンプルコード
Httpのリクエスト経由でIAM認証を通すためには、Signature V4による署名を含めてリクエストを発行してやる必要がある
当該の署名には Security Credential が必要になる
署名の付与は github.com/aws/aws-sdk-go-v2/aws/signer/v4 基本は任せる
必要な情報 (request bodyのハッシュ、regionとか)を渡してやると http.RuestオブジェクトのHeaderに署名情報を付与してくれる
クレデンシャルは github.com/aws/aws-sdk-go-v2/config でとる
Lambda上で実行する場合は他にうまくクレデンシャルとる方法ないんかな?と思ったりもしたけど、特にみつけられず
無事IAM Role経由でAppSync のAPIを叩くことができた