【AWS】関数URLを利用して外部からLambda関数を呼び出す

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

2022年4月6日にLambda関数に「関数URL」という機能が追加されたようです。

https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-lambda-function-urls-built-in-https-endpoints/

一言でいうと、API Gatewayの設定なしで外部からLambda関数を呼べるみたいです！
そこで今回は**Lambda関数の関数URLの使い方を説明したいと思います♪**
AWSについて勉強中の方の参考になれば幸いです。
(*^^)v

# 2.用語の説明
## 2.1.Lambdaとは
LambdaとはAWSのサービスの1つで、コードを書くだけで即実行ができるサービスのことです。
サーバの設定等が不要なため、便利です。

ただし、15分以上続けて実行することはできないため、
複雑なアプリケーションの場合はEC2やECRでの実行が必要となります。

# 3.前提条件
* Lambda関数が作成済であること
* Lambda関数を実行するIAMユーザが作成済であること
* 上記IAMユーザに「lambda:InvokeFunctionUrl」の権限が付与されていること
* 上記IAMユーザのアクセスキー・シークレットアクセスキーの情報を取得していること

# 4.関数URLを設定する
では早速、関数URLを設定してみます。

4.1.Lambdaの管理画面から「設定」を選択します。

|![010_設定を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/a1324a29-29e9-8fc2-7fe7-94a44cbd4e9a.png)|
|:--|

4.2.「関数URL-新規」を選択し、「関数URL」を作成を選択します。

|![020_関数URLを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/d6ccbe83-7dc2-802b-b964-ef34a53e67c9.png)|
|:--|

4.3.以下の表のとおりに設定し、「保存」を選択します。

|項目|設定内容|
|---|---|
|認証タイプ | NONE |
|オリジン間リソース共有（CORS)を設定 | チェックあり |
|許可オリジン | * |
|許可メソッド | * |

|![030_設定画面_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/92572c6c-36c0-8c99-d3d7-1f6d3313e711.png)|
|:--|

4.4.URLが表示されるので、コピーします。

|![040_URLの確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/3af7506f-bff6-898b-92fb-24ae0e9434e5.png)|
|:--|

4.5.ブラウザを開き、コピーしたURLにアクセスします。
4.6.Lambdaからの戻り値が表示されます。

|![050_URLへ接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/5939ba7e-93ba-9c9c-7aaf-83d1c6187468.png)|
|:--|

※以下のLambdaを使用した場合の画像となります。

```python
import json
import logging

#ロガーの生成
logger = logging.getLogger('log')
#デバッグレベルの設定
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    # TODO implement
    logger.info(json.dumps(event));
    return {
        'statusCode': 200,
        'body': json.dumps('関数URLのテストです。',ensure_ascii=False)
    }

```

# 5.セキュリティ向上のため、IAMユーザの認証情報を使用して接続する
4節で外部からLambda関数を呼べることが分かりましたが、
そのままの設定では、**URLを知っていれば、世界中の誰でもアクセスできる**ため、
IAMユーザの認証情報を使用して、外部からのアクセスを制限する方法について記載します。

5.1.関数URLの画面から「編集」を選択します。

❘![060_編集を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/6c350145-e8fb-c551-02fb-9ae00c1099ae.png)|
|:--|

5.2.認証タイプを「AWS_IAM」に変更し、「保存」を選択します。

|![070_認証方式を設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/ad5620db-6868-0652-e9e1-478e6ec2d109.png)|
|:--|

5.3.ブラウザからアクセスするとエラーになります。

|![080_認証方式を変更後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/e7bf95d3-5492-d6a8-1b62-f4374cedaae7.png)|
|:--|

5.4.コマンドプロンプトを開き、以下のコマンドを実行します。
※（IAMユーザのアクセスキー）と（IAMユーザのシークレットアクセスキー）の間にある「:」を忘れないようにしてください。

```
curl -XPOST "（関数のURL）" -H "Content-Type: application/json" --aws-sigv4 "aws:amz:ap-northeast-1:lambda" --user "（IAMユーザのアクセスキー）:（IAMユーザのシークレットアクセスキー）"
```

5.5.Lambdaからの戻り値が表示されます。
（IAMユーザの認証情報を利用して認証ができています）

|![090_コマンド実行後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/f64f2035-a84f-bf9a-5d54-5173618a42db.png)|
|:-|

# 6.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

関数URLを使うことで、API Gatewayよりも簡単にLambda関数を呼び出すことができました！
ただ、POST・GETの場合に呼び出すLambdaを変えるということはできなさそうだったので、
その場合はAPI Gatewayが活躍するのかなと感じました。

AWSは今後もアップデートされるので、何か気づいたら記事にします♪
(:3_ヽ)_