Amazon API GatewayのIAM認証の動作を確認しました
API GatewayのIAM認証は、IAMユーザーが実行できるように認証する、ということはわかっていても細かい動作は手元で動かしてみないと、でしたのでやってみました。
主な手順は公式ナレッジのAPI Gateway API の IAM 認証を有効にする方法を教えてくださいを参考にしています。
Amazon API Gatewayでモックを作るで作ったAPIで試します。
目次
API Gatewayの設定
メソッドリクエストで、[認可]に[AWS_IAM]を選択しました。
[アクション]-[APIのデプロイ]でデプロイしておきました。
そして、ブラウザからAPIの呼び出しをすると、以下のメッセージが返ってきました。
1 2 3 4 |
{ message: "Missing Authentication Token" } |
IAM
IAMユーザーは同じアカウントと別アカウントで3ユーザー作っておきます。
* api-exe-valid
* api-exe-nonvalid
* api-not-exe
各IAMユーザーの最終的なシナリオです。
IAMユーザー | IDベースのポリシー | リソース(API)ベースのポリシー | アカウント |
---|---|---|---|
api-exe-valid | 許可 | 許可 | 別 |
api-exe-nonvalid | 許可 | なし | 同 |
api-not-exe | なし | なし | 同 |
IDベースのポリシーは以下をインラインポリシーに設定しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "execute-api:Invoke" ], "Resource": [ "arn:aws:execute-api:us-east-1:123456789012:apiid/*/GET/" ] } ] } |
ARNは、API Gatewayコンソールのリソースのメソッドリクエストにありますので、コピーして貼り付けています。
段階的に確認していきますので、まずはユーザーを作成して、APIのリソースベースのポリシーはなしで試します。
IDベースのみで確認
APIの実行確認は、POSTMANで行いました。
IAM認証によるAPIの実行には、バージョン4での署名が必要なのですが、POSTMANにアクセスキーIDとシークレットアクセスキーを設定すると、生成してくれますので便利です。
同じアカウントでIDベースのポリシーなし
api-not-exe
1 2 3 4 |
{ "Message": "User: arn:aws:iam::123456789012:user/api-not-exe is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********9012:apiid/prod/GET/" } |
IDベースのポリシーで許可していませんので、api-not-exeユーザーには権限が無いメッセージが返ってきました。
想定どおりです。
同じアカウントでIDベースのポリシーあり
api-exe-nonvalid
1 2 3 4 5 |
{ "statusCode": 200, "message": "Hello from API Gateway!" } |
IAM認証が成功して、結果が表示されました。
違うアカウントでIDベースのポリシーあり
api-exe-valid
1 2 3 4 |
{ "Message": "User: arn:aws:iam::098765432109:user/api-exe-valid is not authorized to access this resource" } |
リソースに対しての権限がないというメッセージが表示されました。
リソースベースのポリシーを別アカウント向けに設定して確認
APIのリソースポリシーはこのようなポリシーです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::098765432109:root", "arn:aws:iam::098765432109:user/api-exe-valid" ] }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:1234566789012:apiid/prod/GET/*" } ] } |
違うアカウントでIDベースのポリシーあり
api-exe-valid
1 2 3 4 5 |
{ "statusCode": 200, "message": "Hello from API Gateway!" } |
認証が成功しました。
別のアカウントからはAPIにリソースポリシーが必要ということがわかりました。
ちなみに
同じアカウントでIDベースのポリシーあり
api-exe-nonvalid
1 2 3 4 5 |
{ "statusCode": 200, "message": "Hello from API Gateway!" } |
認証成功しました。
リソースポリシーで別アカウントのみとしたいときは拒否ポリシーも必要ですね。
ということで、リソースポリシーに拒否ポリシーを追加してNotPrincipalにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::098765432109:root", "arn:aws:iam::098765432109:user/api-exe-valid" ] }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:1234566789012:apiid/prod/GET/*" }, { "Effect": "Deny", "NotPrincipal": { "AWS": [ "arn:aws:iam::098765432109:root", "arn:aws:iam::098765432109:user/api-exe-valid" ] }, "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:us-east-1:1234566789012:apiid/prod/GET/*" } ] } |
これで、別アカウントのIAMユーザー以外からは拒否できるAPIができました。
最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。
【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。
i【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。

開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター3年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
webフォームからの問い合わせをRedmineに自動登録して対応状況を管理する(API Gateway + Lambda)
先日、検証目的で作成したRedmineの冗長化の一機能として、webフォームから …
-
-
AWS LambdaでS3 Select
RDSスナップショットをS3にエクスポートした、Parquetフォーマットのデー …
-
-
Amazon Aurora Serverless のログをCloudWatch Logsに出力する
WordPress W3 Total Cache のDatabaseCacheを …
-
-
AWS CDK とにかくサンプルでやってみる
Cloud9でAWS CDK環境で作った環境でサンプルプロジェクトからのデプロイ …
-
-
Pepperで撮影した写真をAmazon Rekognitionで分析してその結果をPepperがしゃべる ~(1)AWS編~
Pepperの機能を使えるところは使って、何かしたいなあと思ってまして。 目(カ …
-
-
EC2にSystems MangerからCloudWatchエージェントをインストール
CloudWatchエージェント EC2の標準メトリクスでは収集できないメモリの …
-
-
Route53でドメインを新規取得してDNSレコードを設定する
Elastic IPをAWSで発行しているのですから、DNSの設定も同じようにマ …
-
-
RDSの証明書をrds-ca-2019に更新しました
クライアント接続で署名書使ってないので、必要ないのですが、古いままなのも気持ち悪 …
-
-
AWS Service Catalogチュートリアル
AWS Service Catalog 開始方法のチュートリアルにそってみました …
-
-
再会の日 ~re:Union 2018 Osaka by JAWS-UG~
8/5は大阪でre:Unionでした。 「再会」と名うったこのイベントは、6月に …