はじめに
APIGatewayにはIAM認証機能といったものがあるのですがご存じでしょうか。
この機能を使用するとIAM認証情報(アクセスキー・シークレットアクセスキー)を指定しなければAPIを呼び出せないように制限をかけることができます。
ということでIAM認証を使用したAPIの呼び出しを検証したので、設定方法を記事にまとめてました。
目次
- アクセスキー・シークレットアクセスキーとは
- IAMユーザの作成
- アクセスキーとシークレットキーをダウンロードする
- WEBサーバの作成
- 内部NLBの作成
- VPCリンクの作成
- APIの作成
- IAM認証を有効化する
- APIのテスト
- APIをデプロイ
- APIを呼び出してみる
アクセスキー・シークレットアクセスキーとは
そもそもなんやねんそれって方に向けて軽く説明します。
AWSのコンソールにログインして何か操作を行うとき、IAMユーザが実行可能なアクションはユーザに関連付けられたIAM Roleによって定義されています。
AWSコンソール内でリソースを操作するにはIAMユーザとしてログインすればいいですが、コンソールにログインせず、リソースを操作したい(AWS CLIやプログラムからリソースを操作したい)場合はどのようにすればいいでしょうか。
このような時にアクセスキーとシークレットアクセスキーを使用します。
アクセスキー・シークレットアクセスキーはIAMユーザから作成され、
このキー情報(IAM認証情報)を使用したリクエストは、作成元のIAMユーザと同一の権限を有しているとみなされます。
例えば「EC2の起動・停止」をプログラムで操作したい場合は、「EC2の起動・停止」の権限を有したIAMユーザからアクセスキー・シークレットアクセスキーを生成し、プログラムに埋め込むことでEC2の操作ができるようになります。
今回の検証ではAPIの呼び出し許可ポリシーを付与したIAMユーザからキーを生成し、生成したキーをリクエストに埋め込んで使用します。
IAMユーザの作成
APIの実行権限を付与したIAMユーザを作成します。
IAMユーザ作成時に、「アクセスキー・プログラムによるアクセス」を指定します。
ポリシーは「AmazonAPIGatewayInvokeFullAccess」で作成します。
アクセスキーとシークレットキーをダウンロードする
シークレットアクセスキーはこの画面でしか確認することができません。
必ずcsvファイルのダウンロードを行ってください。
ダウンロードしたcsvファイルの中身は以下のようになっています。
WEBサーバの作成
以下の記事で紹介したCloudFormationテンプレートを使用することで、セッションマネージャによる接続が可能なEC2を起動することができます。
- 【AWS】CloudFormationでセッションマネージャで接続可能なEC2を構築してみた(NATGateway編)
-
【AWS】CloudFormationでセッションマネージャによる接続可能なEC2を構築してみた(VPCEndpoint編)
今回の検証ではプライベートサブネットに起動したEC2にnginxをインストールし、デフォルト設定のまま起動しています。
内部NLBの作成
APIGatewayとプライベートサブネットをつなげるために内部NLBをプライベートサブネット内に作成します。
NLBのターゲットグループにプライベートサブネットに起動したEC2を指定しています。
VPCリンクの作成
APIGatewayでVPCリンクを作成し内部NLBと接続します。
今回はRESTAPIの呼び出しを行うので、「REST APIのVPCリンク」を指定し、先ほど作成した内部NLBをターゲットに指定します。
作成完了まで数分かかりますが、成功すると以下のようになります。
APIの作成
画像のようにパブリックREST APIを作成します。
メソッドを作成したら、統合タイプに「VPCリンク」を指定し、エンドポイントに「NLBのDNS名」を指定します。
IAM認証を有効化する
メソッドリクエストの「認可」に「AWS IAM」を設定します。
APIのテスト
テストを実行し、HTTSステータス200が返ってくることを確認します。
APIをデプロイ
テストでステータス「200」が返ってきたことを確認したらAPIをデプロイします。
※デプロイ前にリソースポリシーが定義されている必要があります。今回はステージ名を「public」としてデプロイしました。
APIを呼び出してみる
Postmanを使用してAPIの呼び出しを行います。(Postmanの使い方については割愛します。
まずはアクセスキーを指定せず、APIを呼び出してみます。
「{"message":"The security token included in the request is invalid."}」と表示され呼び出すことができませんでした。
つぎにアクセスキーとシークレットアクセスキーを指定して呼び出してみます。
今度はうまく表示されました!!
さいごに
呼び出し元のアクセスキーに関する制御を行わなかったので、ポリシーの作り込み等が必要になるかと思いますが、大体の仕組みは理解できました。
やっぱ誰かの記事を読むだけじゃなくて、実際に動かさないと見えてこない課題ってありますね。。。
自分の場合、内部NLBとVPCリンクを使用した構築が初めてでしたので、非常に勉強になりました。
あと、API呼び出しに使用したpostmanってナニ?って感じでしたが、めちゃくちゃ便利だったので今後の検証でも重宝しそうです(笑)
今回の検証ではいじりませんでしたが、統合レスポンス・メソッドレスポンスのマッピングテンプレートの理解が浅いので別の機会で検証してみたいと思ってます。