2017-06-03 67 views
1

我正在使用Terraform來構建一個API +相應的lambda函數。如何設置AWS lambda以訪問兩個單獨的VPC中的資源?

我有一些其他的基礎設施,我想,認爲是很好的建立了這(也許我錯了?):

  • 2的VPC(讓我們只是看見他們testprod
  • 私人&公共子網在專用子網

所有的資源都在兩個相同的VPC推出VPC每個

  • RDS數據塊;例如有一個test-private-subnet和一個prod-private-subnet與完全相同的規格,相同的數據庫,等等。

    現在,我正在研究API和lambdas,將支持所說的API。

    我不覺得我需要一個test & prod API網關和test & prod lambda表達式:

    • 拉姆達代碼是相同的,只是作用於不同的DB
    • 您可以使用API​​ stage_variables ,用不同的ips實現testprod API環境

    但是,當我嘗試設置與vpc_config塊一個lambda(因爲我需要它與上所允許的數據塊入口的安全組關聯),我收到以下錯誤:

    Error applying plan: 
    
    1 error(s) occurred: 
    
    * module.lambdas.aws_lambda_function.api-lambda-users: 1 error(s) occurred: 
    
    * aws_lambda_function.api-lambda-users: Error creating Lambda function: InvalidParameterValueException: Security Groups are required to be in the same VPC. 
    status code: 400, request id: xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx 
    

    我拉姆達配置看起來像這樣:

    resource "aws_lambda_function" "api-lambda-users" { 
        provider = "PROVIDER" 
        function_name = "users" 
        s3_key   = "users/${var.lambda-package-name}" 
        s3_bucket  = "${var.api-lambdas-bucket}" 
        role    = "${aws_iam_role.lambda-role.arn}" 
        handler   = "${var.handler-name}" 
        runtime   = "${var.lambda-runtime}" 
    
        vpc_config { 
        security_group_ids = [ 
         //"${data.aws_security_group.prod-lambda.id}", 
         "${data.aws_security_group.test-lambda.id}" 
        ] 
        subnet_ids = [ 
         //"${data.aws_subnet.prod-primary.id}", 
         "${data.aws_subnet.test-primary.id}" 
        ] 
        } 
    } 
    

    注意我最好喜歡在它們的相應列表中指定它們。

    我錯過了什麼嗎?

    對此提出建議?

    任何幫助,有關與否,非常感謝。

  • +4

    通常情況下,爲Test設置完全重複的環境是很好的做法。這樣,您可以嘗試更改(例如改進的Lambda代碼),而不會影響生產環境。鑑於Lambda和API網關在未被使用時不會消耗任何成本(API網關緩存除外(如果已激活)),因此沒有必要避免創建完整的測試環境。 –

    +0

    謝謝。也考慮到了這一點,但認爲這是過度殺傷力。很高興聽到它不是;可能是我最終會做的! – yoaquim

    回答

    4

    在vpc內部運行的Lambda與ec2實例具有相同的網絡「規則」。所以它不能在兩個VPC中「存在」。如果lambda函數需要在兩個單獨的VPC中討論vpc資源,則可以使用類似VPC對等的方法,或者只是在兩個不同的vpc中運行兩個函數副本。

    When you add VPC configuration to a Lambda function, it can only access resources in that VPC. If a Lambda function needs to access both VPC resources and the public Internet, the VPC needs to have a Network Address Translation (NAT) instance inside the VPC and a VPC Peering connection.

    +1

    謝謝。可能會用一個lambda函數/ VPC,像[John Rotenstein](https://stackoverflow.com/users/174777/john-rotenstein)的評論! – yoaquim

    +0

    構建兩個VPC(測試和產品)的原因是要隔離環境,對於這種情況,vpc對等不是一個好建議。 – BMW

    +0

    我同意,這就是他們給你的亞馬遜繩索 – strongjz

    相關問題