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的主要内容,如果未能解决你的问题,请参考以下文章
无法将 s3 与来自 aws lambda 的 ec2 文件夹同步