7
3

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 1 year has passed since last update.

BeeXAdvent Calendar 2022

Day 11

【AWS】IAM認証を使用したLambdaの関数URL呼び出しをやってみた

Last updated at Posted at 2022-12-10

はじめに

LambdaをAWSの外部から呼び出す方法として、APIGatewayでエンドポイントを作成し、そのURLにアクセスすることでLambdaが実行される仕組みがありますが、Lambdaから呼び出し用URLを生成することができるようになっていたことをご存知でしょうか。(最近って程でもないですが2022年4月のアップデートです)

存在は知ってましたが動かしたことなかったので軽く触ってみようと思います。

目次

  1. IAM認証とは
  2. アクセスキー・シークレットアクセスキーとは
  3. 使用するコード
  4. Lambda関数の作成
  5. IAM認証を無効化した呼び出し
  6. IAMアクセスキーを発行する
  7. IAM認証を有効化した呼び出し
  8. さいごに

IAM認証とは

呼び出す際にIAMユーザの認証情報(アクセスキー・シークレットアクセスキー)を指定しなければ、呼び出せないように制限をかけることができる機能です。

アクセスキー・シークレットアクセスキーとは

AWSのコンソールにログインして何か操作を行うとき、IAMユーザが実行可能なアクションはユーザに関連付けられたIAM Roleによって定義されています。
AWSコンソール内でリソースを操作するにはIAMユーザとしてログインすればいいですが、コンソールにログインせず、リソースを操作したい(AWS CLIやプログラムからリソースを操作したい)場合はどうすればいいのかって問題があるかと思うのですが、このような場合にアクセスキーとシークレットアクセスキーを使用します。

アクセスキー・シークレットアクセスキーはIAMユーザから作成され、
このキー情報(IAM認証情報)を使用したリクエストは、作成元のIAMユーザと同一の権限を有しているとみなされます。

例えば「EC2の起動・停止」をプログラムで操作したい場合は、「EC2の起動・停止」の権限を有したIAMユーザからアクセスキー・シークレットアクセスキーを生成し、プログラムに埋め込むことでEC2の操作ができるようになります。
今回の検証ではLambdaのコード内でEC2-describeを実行しますので、許可ポリシーを付与したIAMユーザからキーを生成し、生成したキーをリクエストに埋め込んで使用します。

使用するコード

あらかじめ作成しておいたEC2(インスタンス名:QiitaTest)の情報を取得し、string形式で返却するだけの仕組みです。

ec2_describe.py
import json
import boto3

ec2_client = boto3.client("ec2")
def lambda_handler(event, context):
    instance_name = "QiitaTest"
    response = ec2_client.describe_instances(Filters=[{'Name':'tag:Name','Values':[instance_name]}])
    return str(response)

こちらが取得対象のインスタンスです。
image.png

Lambda関数の作成

今回作成するLambdaには以下の権限を持ったロール付与してください。

  • CloudWatchAgentServerPolicy
  • AmazonEC2ReadOnlyAccess

「CloudWatchAgentServerPolicy」はCloudWatchLogsでログを確認するために必要な権限です。これがなければロググループの作成やログの書き込みが行われません。

必要なロールの準備ができたらLambda関数を作成していきます。
今回の検証では「IAM認証無効した場合」、「IAM認証有効化した場合」の検証をするため2つ作成します。

URLによる呼び出し可能なLambdaの作成方法は関数作成時に「関数 URL を有効化」にチェックを入れます。
その際に「認証タイプ」からIAM認証を有効化するか、無効化するか選択してください。
image.png

IAM認証を無効化した呼び出し

まずは先ほど記載したコードを、作成したLambdaにデプロイします。
ブラウザだとレスポンスが見づらいのでPOSTMANにURLを入力して実行してみます。
(URLを直接クリックするだけでもレスポンスは確認できます。)
image.png
describe_instancesの結果が表示されました!

IAMアクセスキーを発行する

次に、IAM認証を有効化した場合の呼び出しに使用するアクセスキーを発行します。
Lambda実行権限を持ったIAMユーザ名を選択し、そのユーザからアクセスキーを発行します。

IAMの画面を表示し、「アクセスキーの作成」を押下します。

image.png
するとCSVファイルがダウンロードできるので取得します。
シークレットアクセスキーはこのタイミングでしかダウンロードできないので注意してください。
image.png

IAM認証を有効化した呼び出し

IAM認証を使用した呼び出しにはアクセスキーによるトークン発行が必要です。
プログラムから生成することも可能ですが、ちょっと大変なので先ほど同様、POSTMANから呼び出してみます。
まずはIAM認証を有効化したLambdaのURLをPOSTMANに入力しそのまま呼び出してみます。
アクセスキー・シークレットアクセスキーが指定されていないので、「Message:Forbiden」と呼び出しに失敗しました。
image.png

次にPOSTMANの「Autorhization」にアクセスキー、シークレットアクセスキーを入力します。
「Type」は「AWS Signature」,「ServiceName」に「lambda」と入力し「Send」を押下してください。
image.png
今度はレスポンスが返ってきました!

さいごに

検証内容としてはかなり薄い感じになってしまいましたが、ずっと気になっていたので試せてよかったです。

VPC内からの呼び出しのみを許可するプライベートURLとして使用したい場合はAPIGatewayのプライベートエンドポイント作成が必要そうですが、そのうちアップデート入るのかな?と期待してます。
アップデートされたらまた試してみます。

今回はここまでとなります。
最後まで読んでいただきありがとうございました。

7
3
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
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?