VPC の AWS Lambda 関数で boto を使用する

VPC の AWS Lambda 関数で boto を使用する

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 を追加すると、この問題は解決しました。

関連情報