目的
- documentDBにLambdaから書き込みたい
- 構成はterraformにて行う
LambdaのVPC接続について
VPC接続
利点
昔は遅かった
- VPC内接続のLambdaは昔は非常に遅く、一回の実行10秒とかかかってたらしい(ENIをまいどまいど作っていた)
- アーキテクチャが改善されて大幅改善。
- デプロイ時にENIを作っておいて、それを使い回すパターンになった? aws.amazon.com
DocumentDBへのLamdaからのアクセス(VPC接続)
- DocumentDBはパブリックなエンドポイントを持たない
- VPCのリソースからのアクセスしかできない(もしくはLB等でのアクセス)
- LambdaをVPCに接続して、DocumentDBへアクセスさせる
DocumentDBへのLamdaからのアクセス(VPC接続しない場合)
- LBを使ったアクセス方法もあるらしい(ちょっと古い記事だけど)
DocumentDBを作る
docdb.tf
resource "aws_docdb_subnet_group" "service" { name = "docdb-${var.base_name}-subnet" subnet_ids = [var.subnet_for_docdb1.id, var.subnet_for_docdb2.id] } resource "aws_docdb_cluster_instance" "service" { count = 1 identifier = format("docdb-%s-instnace-%02d", var.base_name, count.index + 1) cluster_identifier = aws_docdb_cluster.service.id instance_class = var.docdb_instance_class } resource "aws_docdb_cluster" "service" { skip_final_snapshot = true db_subnet_group_name = aws_docdb_subnet_group.service.name cluster_identifier = "docdb-cluster-${var.base_name}" engine = "docdb" master_username = var.docdb_admin_user master_password = var.docdb_password db_cluster_parameter_group_name = aws_docdb_cluster_parameter_group.service.name vpc_security_group_ids = [aws_security_group.docdb.id] } resource "aws_docdb_cluster_parameter_group" "service" { family = "docdb3.6" name = "docdb-parameter-group-${var.base_name}" }
variable.tf
# name variable "base_name" {} # vpc information. variable "vpc_main" {} # subnet for docdb variable "subnet_for_docdb1" {} variable "subnet_for_docdb2" {} # instance class variable "docdb_instance_class" { default = "db.t3.medium" } # admin variable "docdb_admin_user" {} variable "docdb_password" {} # allowd security group variable "allowed_security_group" {}
security-group.tf
resource "aws_security_group" "docdb" { name = "docudb-${var.base_name}" vpc_id = var.vpc_main.id egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_security_group_rule" "allowd_secutiry" { type = "ingress" from_port = 0 to_port = 0 protocol = "-1" source_security_group_id = var.allowed_security_group.id security_group_id = aws_security_group.docdb.id }
ポイント
- security groupを指定している
resource "aws_docdb_cluster" "service" { ... vpc_security_group_ids = [aws_security_group.docdb.id] }
- この
aws_security_group.docdb
にて特定のsecurity groupからしかアクセスを許可しない設定にしている(これがLambdaのsecurity group)
resource "aws_security_group_rule" "allowd_secutiry" { ... source_security_group_id = var.allowed_security_group.id }
Lambdaを作る
lambda.tf
resource "aws_lambda_function" "lambda" { ... vpc_config { subnet_ids = [ var.subnet_for_lambda1.id, var.subnet_for_lambda2.id ] security_group_ids = [aws_security_group.for_lambda.id] } environment { variables = { DOCDB_CLUSTER_ENDPOINT = var.docdb_cluster_endpoint DOCDB_ADMIN_USER = var.docdb_admin_user DOCDB_ADMIN_PASSWORD = var.docdb_password } } }
このようにvpc_config
をつけてやればVPC接続で動いてくれるらしい
Lambdaのロールについて
ec2:CreateNetworkInterface ec2:DescribeNetworkInterfaces ec2:DeleteNetworkInterface
AWSLambdaVPCAccessExecutionRole
これを使えばいいとか。
Lambdaソース
- 公式を参考に
プログラムによる Amazon DocumentDB への接続 - Amazon DocumentDB
実行
X-rayで見てみました
初回起動時(コールドスタート)
- 結構遅い
2回め起動時
- 1回目よりは速い(しかし全体で400ms.遅い)
メモリを大きくしてもそこまで速度変わらず