pandazx's blog

データ分析など雑多な技術ブログ

VPC内のLambdaから外部サービスにアクセスする方法

VPC内のEC2やRedshiftなどにアクセスするためにLambdaをVPC内に作成して実行すると、 今度は逆に外部のインターネットやS3, Kinesisなどにアクセス出来なくなる。

その場合の対応方法はAWSの公式ドキュメントに書いてある。

Configuring a Lambda Function to Access Resources in an Amazon VPC - AWS Lambda

日本語情報としては以下がある。

VPC Lambdaからs3へアクセスする - Qiita

以下では上記サイトの補足を述べる。

設定方法について

いずれの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サーバの構築については以下を参照

EC2にNATサーバ構築 - pandazx's blog

ネットワーク構成の補足

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への権限は本当はもっと細かく絞れるらしいが試していない。詳細は以下参照

https://forums.aws.amazon.com/message.jspa?messageID=756727