はじめに
APIサービスを利用するにあたり固定のIPにする必要があったため、Lambda + 固定IPのNATインスタンスを構築しましたので、まとめます。
NATゲートウェイの方が、運用は楽ですが、サービスが小規模かつ、コスト面でNATインスタンスの方が安いため、こちらを利用しました。
##コスト
NATゲートウェイ:稼働時間料金で46 USD/月、+ データ処理および転送料金
NATインスタンス:稼働時間料金で10 USD/月(t3.micro)、+ 転送料金
完成図
事前構築
VPCやサブネットは以下のように作成しましょう。
可用性を考えて、AZを2つ作成するため、サブネットを4つ作成するのもよいです。
パブリックサブネット:10.0.0.0/24、10.0.1.0/24
プライベートサブネット:10.0.2.0/24、10.0.3.0/24
NATインスタンス起動
-
AMIは、 バージョンが新しいものが良いので、↓網かけの部分が新しい年度のものを選択します。
amzn-ami-vpc-nat-2018.03.0.20210408.0
-x86_64-ebs
-
セキュリティーグループは、プライベートサブネットをソースにし、HTTP,HTTPSそれぞれ許可するCIDRを設定する。
また、SSH接続できるように、自分のマイIPアドレスを指定する。(今回は、0.0.0.0/0
)
#NATインスタンスの送信元/送信先チェックの無効化
インスタンスを選択し、[ネットワーキング]
→[ソース/宛先チェックを変更]
をクリックします。
チェックする理由として、パケット送信先がNATインスタンスでない場合でも、パケットは一度NATインスタンスを通る必要があるためです。
プライベートサブネットからのインターネット接続をNATインスタンス経由にする
プライベートサブネットのルートテーブルに、ターゲットをNATインスタンス経由にして、インターネット接続できるよう以下の設定を加えます。
送信先 | ターゲット |
---|---|
0.0.0.0/0 | NATインスタンスID |
Lambda作成
IAMロールは、基本的な Lambda アクセス権限で新しいロールを作成
にして作成します。
タイムアウト
3秒から20秒に変更
IAMロール
AWSLambdaVPCAccessExecutionRole
ポリシーの権限をIAMロールに割り当てる
VPC設置
プライベートサブネットにLambdaを設置し、セキュリティーグループは、デフォルトにしました。
EC2用のセキュリティーグループでもよいです。
コード
インターネットにアクセスできることを確認します。
import json
import urllib.request
url = "https://qiita.com/"
def lambda_handler(event, context):
response = urllib.request.urlopen(url)
return {
'url': response.geturl(),
'code': response.getcode(),
'Content-Type': response.info()['Content-Type']
}
###テスト実行
タイムアウトエラーが出ず以下の結果が出ると成功です。
Response
{
"url": "https://qiita.com/",
"code": 200,
"Content-Type": "text/html; charset=utf-8"
}
##エラー①
AWSLambdaVPCAccessExecutionRole
がアタッチされていない場合、VPC内にLambdaは設置できずエラーになります。
##エラー②
Lambdaがタイムアウトエラーになる場合、Elastic IP
をNATインスタンスにアタッチしているか確認しましょう。
参考