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

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


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

https://aws.amazon.com/jp/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [IAM認証とは](#iam認証とは)
1. [アクセスキー・シークレットアクセスキーとは](#アクセスキーシークレットアクセスキーとは)
1. [使用するコード](#使用するコード)
1. [Lambda関数の作成](#lambda関数の作成)
1. [IAM認証を無効化した呼び出し](#iam認証を無効化した呼び出し)
1. [IAMアクセスキーを発行する](#iamアクセスキーを発行する)
1. [IAM認証を有効化した呼び出し](#iam認証を有効化した呼び出し)
1. [さいごに](#さいごに)

# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/c573b308-d889-7903-13cc-a614af4d6e2a.png)



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

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

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

URLによる呼び出し可能なLambdaの作成方法は関数作成時に「関数 URL を有効化」にチェックを入れます。
その際に「認証タイプ」からIAM認証を有効化するか、無効化するか選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/ea225795-5c6e-d349-f677-0b92dafff70c.png)


# IAM認証を無効化した呼び出し
まずは先ほど記載したコードを、作成したLambdaにデプロイします。
ブラウザだとレスポンスが見づらいのでPOSTMANにURLを入力して実行してみます。
(URLを直接クリックするだけでもレスポンスは確認できます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/63fa1c37-3e46-a247-f94c-61575da16f61.png)
describe_instancesの結果が表示されました！


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/0e3f6a84-c79d-60f2-19e7-dc50e8816f69.png)
するとCSVファイルがダウンロードできるので取得します。
シークレットアクセスキーはこのタイミングでしかダウンロードできないので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/381538ac-db6c-3865-a6af-2114b7c0ea23.png)


# IAM認証を有効化した呼び出し
IAM認証を使用した呼び出しにはアクセスキーによるトークン発行が必要です。
プログラムから生成することも可能ですが、ちょっと大変なので先ほど同様、POSTMANから呼び出してみます。
まずはIAM認証を有効化したLambdaのURLをPOSTMANに入力しそのまま呼び出してみます。
アクセスキー・シークレットアクセスキーが指定されていないので、「Message：Forbiden」と呼び出しに失敗しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/dd1dba61-91be-eb19-ba41-6d95519fa783.png)


次にPOSTMANの「Autorhization」にアクセスキー、シークレットアクセスキーを入力します。
「Type」は「AWS Signature」,「ServiceName」に「lambda」と入力し「Send」を押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/1e601760-bdc6-f338-f502-cc37685f4393.png)
今度はレスポンスが返ってきました！

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

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

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