ave*_*man 5 amazon-web-services opensearch amazon-iam boto3 aws-lambda
我正在尝试使用 opensearch python 客户端(开发目的,非生产)从 AWS Lambda 连接到 AWS OpenSearch 域。
我正在尝试以下操作:
from opensearchpy import OpenSearch
import boto3
from requests_aws4auth import AWS4Auth
import os
import config
my_region = os.environ['AWS_REGION']
service = 'es' # still es???
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, my_region, service, session_token=credentials.token)
openSearch_endpoint = config.openSearch_endpoint
# sth wrong here:
openSearch_client = OpenSearch(hosts = [openSearch_endpoint], auth = awsauth)
Run Code Online (Sandbox Code Playgroud)
根据以下博客:
但它不起作用(它不想进行身份验证,"errorMessage":"AuthorizationException(403, '')"。但是,如果我不使用 python 客户端,而只是简单地执行requests以下操作:
import requests
host = config.openSearch_endpoint
url = host + '/' +'_cat/indices?v'
# this one works:
r = requests.get(url, auth=awsauth)
Run Code Online (Sandbox Code Playgroud)
,我的 lambda 函数确实与 OpenSearch 域进行通信。
我查阅了OpenSearch()文档,但我不清楚它的参数如何映射到boto3会话凭据和/或AWS4Auth. 那么这一行应该做什么
openSearch_client = OpenSearch(hosts = [openSearch_endpoint], auth = awsauth)
Run Code Online (Sandbox Code Playgroud)
是?
几个小时后实际上设法找到了解决方案:
from opensearchpy import OpenSearch, RequestsHttpConnection
my_region = os.environ['AWS_REGION']
service = 'es' # still es?
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, my_region, service, session_token=credentials.token)
host = config.openSearch_endpoint
openSearch_client = OpenSearch(
hosts=[openSearch_endpoint],
http_auth = awsauth,
use_ssl = True,
verify_certs = True,
ssl_assert_hostname = False,
ssl_show_warn = False,
connection_class=RequestsHttpConnection
)
Run Code Online (Sandbox Code Playgroud)
小智 0
OpenSearch 服务需要端口 443 来处理传入请求,因此您需要在附加到 OpenSearch 服务域的安全组下添加新的入站规则。
尝试一下规则:
此外,您应该为 Lambda 函数制定基于资源的策略,以执行对 OpenSearch Service 域的请求。
| 归档时间: |
|
| 查看次数: |
7155 次 |
| 最近记录: |