[英]Access S3 from Lambda within VPC using Terraform
我有一個 Lambda
resource "aws_lambda_function" "api" {
function_name = "ApiController"
timeout = 10
s3_bucket = "mn-lambda"
s3_key = "mn/v1.0.0/sketch-avatar-api-1.0.0-all.jar"
handler = "io.micronaut.function.aws.proxy.MicronautLambdaHandler"
runtime = "java11"
memory_size = 1024
role = aws_iam_role.api_lambda.arn
vpc_config {
security_group_ids = [aws_security_group.lambda.id]
subnet_ids = [for subnet in aws_subnet.private: subnet.id]
}
}
在 VPC 內
resource "aws_vpc" "vpc" {
cidr_block = var.vpc_cidr_block
enable_dns_support = true
enable_dns_hostnames = true
}
我創建了一個 aws_vpc_endpoint 因為我讀到這是我的 VPC 訪問 S3 所需要的
resource "aws_vpc_endpoint" "s3" {
vpc_id = aws_vpc.vpc.id
service_name = "com.amazonaws.${var.region}.s3"
}
我創建並附加了一個允許訪問 S3 的策略
resource "aws_iam_role_policy_attachment" "s3" {
role = aws_iam_role.api_lambda.name
policy_arn = aws_iam_policy.s3.arn
}
resource "aws_iam_policy" "s3" {
policy = data.aws_iam_policy_document.s3.json
}
data "aws_iam_policy_document" "s3" {
statement {
effect = "Allow"
resources = ["*"]
actions = [
"s3:*",
]
}
}
可能值得注意的是,我嘗試訪問的存儲桶是使用 aws cli 創建的,但位於同一區域。 所以不是 terraform。
問題是當我嘗試從 S3 讀取文件時,我的 Lambda 超時。
如果有人想看一看,可以在這里找到完整的項目。
您正在創建com.amazonaws.${var.region}.s3
,它是gateway VPC endpoint ,不應與interface VPC endpoints混淆。
兩者之間的主要區別之一是網關類型需要與路由表關聯。 因此,您應該使用route_table_ids將您的 S3 網關與子網的路由表相關聯。
例如,要使用默認的主 VPC 路由表:
resource "aws_vpc_endpoint" "s3" {
vpc_id = aws_vpc.vpc.id
service_name = "com.amazonaws.${var.region}.s3"
route_table_ids = [aws_vpc.vpc.main_route_table_id]
}
或者,您也可以使用aws_vpc_endpoint_route_table_association來執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.