AWS:Lambda函数无法使用EC2实例的私有API调用rest api

Posted

技术标签:

【中文标题】AWS:Lambda函数无法使用EC2实例的私有API调用rest api【英文标题】:AWS: Lambda function cannot call rest api using private API of EC2 instance 【发布时间】:2018-11-10 05:12:50 【问题描述】:

我正在创建一个 lambda 函数(对 ec2 实例具有完全访问权限并在 dynamo db 流上执行以下操作(DescribeStream、GetRecords、GetShardIterator、ListStreams))。

我的要求是使用 elb 名称获取实例的私有 IP,并在 DynamoDB 流触发的 lambda 事件上调用 rest API。

我的 Lambda 函数 Python3.6 脚本正常工作,可以获取所有私有 IP。

但我不知道如何使用私有 IP 调用 rest API。

我想通知我们,我们有一个堡垒实例(具有公共 IP),我们可以使用它通过隧道通过它进行 ssh。

我不知道该怎么做。

我的python脚本如下:

import boto3
import sys
import string
import subprocess

def instanaceList():
    elb_name = 'xxxx-xxx-xxx-xxx-2-BlueELB'
    print(elb_name)
    print('\n')
    print('THE LIST OF INSTANCES ATTACHED TO THIS ELB IS \n')
    elbList = boto3.client('elb')
    ec2 = boto3.resource('ec2')

    bals = elbList.describe_load_balancers()
    for elb in bals['LoadBalancerDescriptions']:

        set2 = elb['LoadBalancerName']
        if elb_name == set2 :
            inst =  elb['Instances']
            print(inst)
            for xIns in inst:
                print(xIns)
                EC2InstanceId = xIns['InstanceId']
                ec2 = boto3.resource('ec2')
                ec2instance = ec2.Instance(EC2InstanceId)
                print(ec2instance.private_ip_address)
                url = "curl -X GET https://"+ec2instance.private_ip_address+"/voice/diag -H 'cache-control: no-cache'"
                result = subprocess.call(url, shell=True)

def lambda_handler(event, context):
    print('test')
    print(event)
    instanaceList()
    return 'Hello from Lambda'

【问题讨论】:

【参考方案1】:

假设您的问题是让 Lambda 在 VPC 中连接没有公共 IP 的 ec2 实例,那么您需要为您的 lambda 提供额外的配置以使其能够访问 VPC 中的资源。

使用 CLI 的示例(来自 https://docs.aws.amazon.com/lambda/latest/dg/vpc.html):

$  aws lambda create-function \
--function-name ExampleFunction \
--runtime python3.6 \
--role execution-role-arn \
--zip-file fileb://path/app.zip \
--handler app.handler \
--vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=comma-separated-security-group-ids \
--memory-size 1024 

或更新现有 Lambda 的配置:

$ aws lambda update-function-configuration \
--function-name ExampleFunction \
--vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=security-group-ids

如果您的问题实际上是从 Python 进行 API 调用,请查看 how to make post request in python

【讨论】:

将安全组添加到 Lambda 的配置中,以便 ec2 工作允许传入流量!谢谢@K Mo

以上是关于AWS:Lambda函数无法使用EC2实例的私有API调用rest api的主要内容,如果未能解决你的问题,请参考以下文章

SSH到位于VPC中的私有子网中的AWS EC2实例

无法将 s3 与来自 aws lambda 的 ec2 文件夹同步

如何从我的 EC2 实例调用 AWS Lambda 函数?

AWS Lambda 无法访问同一 VPC 中的 EC2 端口

无法通过私有 IP 从另一个实例访问 AWS EC2 实例

通过AWS lambda在EC2实例上执行python脚本