我有一个RDS实例my_instance
和一个lambda。两者位于同一专有网络上。
RDS具有一个SCmy-security-group-rds
和lambda另一个安全组my-security-group-lambda
。
my-security-group-lambda
具有无约束的出站规则。IP为0.0.0.0/0的所有协议。
my-security-group-rds
具有允许来自my-security-group-lambda
的任何访问的入站规则。
在lambda内部,我想执行主机名的DNS解析:
def dns_lookup(domainname,record_type,*dnsserver):
"""
Get dns lookup results
:param domain:
:return: list of dns lookup results
"""
try:
lookup_result_list = []
myResolver = dns.resolver.Resolver()
if not dnsserver:
lookupAnswer = myResolver.query(domainname, record_type)
else:
myResolver.nameservers = dnsserver[0]
lookupAnswer = myResolver.query(domainname,record_type)
for answer in lookupAnswer:
lookup_result_list.append(str(answer))
return lookup_result_list
except Exception as err:
logger.exception("Not able to lookup DNS:{}".format(err))
raise
我首先在rds区域服务器上执行dns_lookup,结果很好。
listOfAuthoritiveNames = dns_lookup("eu-west-1.rds.amazonaws.com", "NS")
然后我尝试在我的实例上执行dns查找:
dns_lookup("my-database.dfafda.eu-west-1.rds.amazonaws.com", "A", listOfAuthoritiveNames)
这会导致超时。如果我为数据库使用了错误的主机名,它会说没有记录,所以它似乎可以访问名称服务器。
知道可能缺少什么吗?
嗨,我看到你缺少lambda的角色。遵循以下步骤:
- 打开IAM控制台的"角色"页面,然后选择"创建角色">
- 对于受信任实体类型,选择AWS服务,对于用例,选择Lambda
- 选择"下一步">
- 通过执行以下操作添加IAM管理的策略:
- 使用策略搜索框,搜索
AWSLambdaVPCAccessExecutionRole
- 在结果列表中,选中角色旁边的复选框,然后选择清除筛选器
- 使用策略搜索框,搜索其他角色权限
AWSLambda...ExecutionRole
。在结果列表中,选中角色旁边的复选框,然后选择"下一步"> - 输入
lambda-vpcname-role
作为"角色名称",然后选择"创建角色">
使用AWS CLI:传递您的lambda角色和sg lambda。
aws lambda create-function --function-name LambdaFunctionWithRDS --runtime python3.9
--zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler
--role arn:aws:iam::111122223333:role/lambda-vpc-sqs-role
--vpc-config SubnetIds=subnet-1234567890abcdef0,subnet-abcdef01234567890,
subnet-021345abcdef6789,subnet-1234abcdef567890,SecurityGroupIds=sg-1234567890abcdef0
希望这能帮助
参考:
- https://docs.aws.amazon.com/lambda/latest/dg/services-rds-tutorial.html#w122aac77d191c13c27