EC2 にアクセスする Lambda があります。セキュリティ上の理由から VPC に割り当てたいのですが、割り当てると boto が動作しなくなります。以下に最小限の例を示します。
ec2 = boto3.resource('ec2', region_name='eu-west-2')
instances = ec2.instances.filter(Filters=[
{
'Name': 'vpc-id',
'Values': [vpc_id]
}
])
for instance in instances:
# function hangs here
print(instance)
Lambda のロールには ec2 に対する必要な権限があり、VPC の外部では正常に動作します。Lambda を VPC (すべての送信トラフィックを許可するセキュリティ グループ内) に配置すると、ハングします。何をする必要がありますか?
答え1
問題は、Lambda 関数が実行されているサブネットに NAT が必要だったことです。インターネット ゲートウェイだけでは不十分です。
これは、Lambda がプライベートでのみ実行され、双方向トラフィックを許可するインターネット ゲートウェイが Lambda との間のルートを許可しないためだと推測しています。
NAT が接続されたプライベートサブネットに Lambda を追加すると、この問題は解決しました。