2017-06-03 126 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

    相关问题