12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

API GatewayでIAM認証してみた

Last updated at Posted at 2021-01-03

公式ナレッジのAPI Gateway API に IAM 認証を有効化するにはどうすればよいですか?を参考に実装してみました!

Lambda関数を作成

一から作成/ランタイムPython3.8/他はデフォルト

関数作成ユーザーがiam:PassRoleの権限がないとエラーが発生します。
AWS のサービスにロールを渡すアクセス権限をユーザーに付与する

テストなので超超シンプルな関数です。

API Gateway作成

  • REST API > 構築 > 新しいAPIの作成
  • アクションのプルダウンからメソッドの作成でGETを選択する。
  • 先ほど作成したLambda関数と統合する。
保存が完了したらデプロイ :rocket:
URLが発行されるのでPostmanから叩いてみます。

この時点ではパブリックAPIです。

API GatewayのIAM認証を有効化

API Gatewayでは、APIに対して以下のような認証方式が存在します。

  • Cognitoを使った認証
  • サードパーティの認証基盤とLambda Authorizerを使った認証
  • IAM認証

今回はIAM認証での実装なので作成したメソッドリクエストの認可をAWS_IAMに変更し再度デプロイします。 :rocket:

再度、APIをPostmanから叩いてみます。

すると"Missing Authentication Token"とメッセージが返ってきます。

IAMの設定

  • 作成したAPIのリクエストの権限ポリシーを作成
  • IAMユーザー作成しポリシーをアタッチ
ポリシーの作成

作成したAPIのarnをResourceに指定しインラインポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke"
            ],
            "Resource": [
                "arn:aws:execute-api:........../*/GET/"
            ]
        }
    ]
}
IAMユーザーを作成し上記ポリシーをアタッチします。Postmanでテストする際にAccess key IDSecret access keyを使うのでメモします。

動作確認

  • Postmanに作成したIAMのAccess key IDSecret access keyをセットして叩いてみます。
出来ました!

:warning:ちなみに権限が足りないと下記のようなエラーが出ます。
ポリシーを確認してみてください。

{
    "Message": "User: arn:aws:iam::123456789:user/api-unvalid is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api............../test/GET/"
}
12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?