AWS 開発者ブログ

IPv6を使用してVPC内のLambdaから別のLambdaをInvokeしてみる

ディーメイクAdvent Calendar 2023 12/12の記事です。

こんにちは、moriです。

AWSでは、2024年の2月からIPv4が課金されるようになりますね。
それもあって、最近はIPv6を意識するようにしています。

少し前のアップデートになりますが、LambdaがIPv6をサポートしました。(2023.10.25)
AWS Lambda が VPC でのアウトバウンド接続において Internet Protocol Version 6 (IPv6) のサポートを発表

今まで、Lambda(IPv4)は直接インターネットにアクセスできなかったため、AWSサービスエンドポイントのAPIを使うためには、NatGatewayまたは、VPCendpointを経由する必要がありました。
このアップデートでは、LambdaにIPv6を付与することができるようになり、Egress-Only IGWを利用して、インターネットリソースにアクセスできるようになったとのことです。

AWSサービスエンドポイントもデュアルスタックに対応しているサービスであれば、Ipv6を利用できるようになったとことです。

AWSのドキュメント(IPv6 をサポートする AWS サービス)を確認したところ、Lambdaもデュアルスタックをサポートしているようでしたので、VPC内のLambdaからLambdaをInvokeしてみようと思いやってみました。

やってみよう!IPv6のLambdaのinvoke呼び出し

前提事項:

  • VPCのデュアルスタックIPv6が設定されていること
  • Egress-Only IGWが設定され、ルーティング設定まで完了していること

VPC内にtestinvoke01testinvoke02の二つのLambdaの関数を作成します。
testinvoke01からtestinvoke02を呼び出す動作の例となります。今回使用するサンプルはPythonを使用します。

まずは呼び出されるLambda Functionを用意します。

<testinvoke02>
import json

def lambda_handler(event, context):
    print('Called by testinvoke01')
    return {'message': 'called by testinvoke01'}

続いて、呼び出す側のLambda Functionを用意します。

ポイント
Lambdaの場合はDual stack endpointsというものがあるそうで、明示的に「endpoint_url」を指定する必要があるみたいです。

<testinvoke01>
import json
import boto3

def lambda_handler(event, context):
    print('testinvoke01')
    # 別Lambda関数の呼び出し
    response = boto3.client('lambda', endpoint_url='https://lambda.ap-northeast-1.api.aws').invoke(
        FunctionName = 'testinvoke02',
        InvocationType='RequestResponse'
        )
    print(response)

忘れずに、IAMロールを修正します。呼び出し元(testinvoke01)に、LambdaをInvokeするための権限を付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAuroraToExampleFunction",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:*:<AWSアカウント>:function:*"
        }
    ]
}

LambdaのIPv6を設定します。

Lambdaのコンソール画面から「設定」タブのVPCの項目を設定していきます。
VPCとサブネット、セキュリティグループを設定します。
「デュアルスタックのサブネットの IPv6 トラフィックを許可」にチェックを入れます。

準備ができたので、実際に実行していきたいと思います。

Lambdaのコンソールからテスト実行していきます。

ステータスコードが200で返ってきており成功しました。

呼び出されたtestinvoke02の実行結果の確認は、Cloudwatch ログを確認します。
無事にInvokeが成功しることがわかります。

一応、Lambdaの設定で、「デュアルスタックのサブネットの IPv6 トラフィックを許可」のチェックを外し、IPv6なしで実行してみたところ、タイムアウトという結果になりました。IPv6のトラフィックを使ってInvokeできていたことになろうかと思います。

所感

セキュリティ等を考慮するのであれば、LambdaのVPCエンドポイントを作成する方がAWSベストプラクティスではないかと思われます。

ただ、インターフェイス型のVPCエンドポイントは有料となります。また、NatGatewayを使った場合もNatGatewayの料金がかかってきますので、コストをかけたくない場合にこの方法はとても有効な方法かと思いました。

IPv6は敷居が高くてなかなか利用に踏み切れていないのですが、こういったメリットもありますので、どんどん利用していけたらと思っています。


Recruit

ディーメイクでは各ポジションで一緒に働く仲間を募集中! エンジニア、デザイナー、ディレクターなど、多彩な職種があります。
一緒に成長していきましょう!

最新記事

おすすめ記事リンク

-AWS, 開発者ブログ
-, , , ,