VPC内のLambdaから外部サービスにアクセスする方法
VPC内のEC2やRedshiftなどにアクセスするためにLambdaをVPC内に作成して実行すると、 今度は逆に外部のインターネットやS3, Kinesisなどにアクセス出来なくなる。
その場合の対応方法はAWSの公式ドキュメントに書いてある。
Configuring a Lambda Function to Access Resources in an Amazon VPC - AWS Lambda
日本語情報としては以下がある。
以下では上記サイトの補足を述べる。
設定方法について
いずれのVPC内からもアクセス可能に出来るわけではなく、private subnet内にLambdaを設置することが条件である。
public subnet にNATサーバを構築し、private subnet はNATサーバ経由でインターネットにアクセスする構成とする。 private subnetが参照するルートテーブルにおいて、0.0.0.0/0 をpublic subnetのNATサーバにルーティングするよう設定すればよい。 設定イメージは下記ページの図が参考になる。
NAT ゲートウェイ - Amazon Virtual Private Cloud
NATサーバの構築については以下を参照
ネットワーク構成の補足
private subnet と public subnet についてだが、インターネットに直接つながっているsubnetをpublic subnet、 つながっていないsubnetをprivate subnet と呼ぶ。subnetのルートテーブルで0.0.0.0/0をインターネット・ゲートウェイにルーティングしているとpublic subnetとなる。
NATサーバのセキュリティグループ
当然、S3やKienesisなどへのアクセスをNATで受けるため、インバウンドの該当ポートは開けておく必要がある。
LambdaのIAM Role
LambdaからKinesisにアクセスしたい場合は、それ用のIAM Roleを作成しておく必要がある。 RoleにはAWSLambdaKinesisExecutionRoleとAmazonEC2FullAccessが必要。
参考:ステップ 2.2: 実行ロール (IAM ロール) を作成する - AWS Lambda
EC2への権限は本当はもっと細かく絞れるらしいが試していない。詳細は以下参照