簡體   English   中英

使用 Terraform 從 VPC 內的 Lambda 訪問 S3

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM