Lapis Lazuli

technical blog for web developer

APIGatewayのIAM認証

lambdaのAPI化としてよく使われるAPIGatewayですが、APIの認証を入れたいときがあると思います。
特にAWS内部への処理をする場合、誰でも叩かれたらマズいですしね。
なのでAPIGatewayには認証機能が実装されています。
一番簡単なのはAPIキーを設定して、それがヘッダーに存在していて、かつ一致するかを判断する方法です。
が、これだと特定のユーザーだけ許可したい時とかに不便になります・・・
そこで出てくるのがIAM認証です。

APIGatewayの設定

APIGateway側はメソッドの部分を変えてリリースするだけで認証なしではアクセスできなくなります。
メソッドリクエストの認証をAWS_IAMにします。(下記はterraformのソース)

resource "aws_api_gateway_method" "test-post" {
  rest_api_id = aws_api_gateway_rest_api.test.id
  resource_id = aws_api_gateway_resource.test.id
  http_method = "POST"
  authorization = "AWS_IAM"
}

Cognito

認証済みとそうでないものを判別するため、Cognitoのアイデンティティプールを使って判断します。
Cognitoは認証基盤のようなサービスなのですが、主にユーザープールとアイデンティティプールの2つの機能があります。
今回はアイデンティティプールを利用します。

アイデンティティプールを作成すると、~~Unauth_Roleという未認証ロールとAuth_Roleという認証ロールが作られます。
これのロールポリシーの作成で、許可するARNに作ったAPIGatewayのメソッドのARNを渡してあげればOKです。
認証済みならポリシーをアタッチしたユーザーのみアクセスできるようになります。

まとめ

APIゲートウェイの認証周りは色々な組み合わせがあり、理解するだけでも大変です。
ですがアップデートで着実に使い勝手はよくなっているので、(lambdaのマッピングを自動でやってくれたりとか)積極的に活用していきたいですね。
よく使うRESTAPIだけではなく、HTTPAPIのほうも様々な機能が追加されているようなので、使う機会があったら使ってみたいと思います。