ディーメイク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内にtestinvoke01
とtestinvoke02
の二つの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は敷居が高くてなかなか利用に踏み切れていないのですが、こういったメリットもありますので、どんどん利用していけたらと思っています。