【问题标题】:AWS Lambda Function not joining VPCAWS Lambda 函数未加入 VPC
【发布时间】:2017-08-24 20:06:48
【问题描述】:

我正在尝试连接到我的 AWS Aurora DB。按照文档指南 3 次以上,我在 mysql 连接上收到了相同的超时错误。深入研究后,似乎我的 lambda 函数根本没有加入 VPC。

我将列出一些输出(删除了不必要的行)来说明我是如何得出这个结论的。

如果有人能指出我的配置哪里出错了。请告诉我。在任何人提到它之前,是的,我已经多次检查了 db 程序变量;应该是配置问题。

角色:

$ aws lambda get-function-configuration --function-name "test" --output json
{
    "FunctionName": "test",
    "VpcConfig": {
        "SubnetIds": [
            "subnet-560b810e",
            ...
        ],
        "VpcId": "vpc-c3e2f3a7",
        "SecurityGroupIds": [
            "sg-e029969a"
        ]
    },
    "Role": "arn:aws:iam::141066641105:role/test"
}

附加政策清单:

$ aws iam list-attached-role-policies --role-name test --output json
{
    "AttachedPolicies": [
        {
            "PolicyName": "AWSLambdaVPCAccessExecutionRole",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
        }
    ]
}

VPC:

$ aws ec2 describe-vpcs --vpc-ids "vpc-c3e2f3a7" --output json
{
    "Vpcs": [
        {
            "VpcId": "vpc-c3e2f3a7",
            "State": "available",
            "CidrBlock": "172.31.0.0/16",
        }
    ]
}

安全组:

$ aws ec2 describe-security-groups --group-ids "sg-e029969a" --output json
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [],
            "IpPermissions": [
                {
                    "PrefixListIds": [],
                    "FromPort": 0,
                    "IpRanges": [],
                    "ToPort": 65535,
                    "IpProtocol": "tcp",
                    "UserIdGroupPairs": [
                        {
                            "UserId": "141066641105",
                            "GroupId": "sg-e029969a"
                        }
                    ]
                },
            ],
            "GroupName": "db-access",
            "VpcId": "vpc-c3e2f3a7",
            "OwnerId": "141066641105",
            "GroupId": "sg-e029969a"
        }
    ]
}

IP地址python代码:

import socket
response = socket.gethostbyname('test.db')
logger.log("test.db IP: " + response)

import subprocess
command = "/sbin/ip addr show"
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
response = process.communicate()
logger.error("IP command: " + response[0])

IP地址输出:

test.db IP: 172.31.29.170
IP command: 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
57: vinternal_19@if58: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 8a:ae:cc:86:d7:e7 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet 169.254.76.37/23 scope global vinternal_19
       valid_lft forever preferred_lft forever
60: vtarget_10@if59: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 72:6b:24:a0:47:d4 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 169.254.79.1/32 scope global vtarget_10
       valid_lft forever preferred_lft forever

如您所见,由于某种原因,我得到了169.254.x.x 地址,而不是 VPC 的172.31.x.x。另外需要注意的是,数据库属于同一个 VPC 中的同一个安全组。

【问题讨论】:

  • 您的安全组显示为空 IpPermissionsEgress。如果我没看错,这意味着所有出站流量都被阻止。顺便说一句,lambdash 可以方便地调试 Lambda 环境。
  • 同意@JohnRotenstein 该函数无法与安全组通信,因为所有出口都被阻止,只允许入口。您可以添加 0.0.0.0/0(默认)的出口规则,也可以将其设置为 Aurora 数据库的安全组
  • 你是对的@John Rotenstein。这就是问题所在。谢谢!

标签: python amazon-web-services aws-lambda


【解决方案1】:

您的安全组显示为空IpPermissionsEgress

{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [],
            ...

如果我没看错,这意味着所有出站流量都被阻止

传统上,出口规则对所有流量开放,前提是您可以信任在您的 Amazon EC2 实例上运行的内容。因此,您可以将其开放给所有流量,或者至少开放给您希望通信的系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2019-09-18
    • 2019-08-19
    • 2020-12-20
    • 1970-01-01
    • 2016-08-03
    • 2020-07-05
    相关资源
    最近更新 更多