在 aws lambda 上使用 opensearch-py 进行 opensearch 身份验证

Posted

技术标签:

【中文标题】在 aws lambda 上使用 opensearch-py 进行 opensearch 身份验证【英文标题】:opensearch authentication with opensearch-py on aws lambda 【发布时间】:2021-11-30 06:20:04 【问题描述】:

我正在尝试使用 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)

根据以下博客:

https://aws.amazon.com/blogs/database/indexing-metadata-in-amazon-elasticsearch-service-using-aws-lambda-and-python/ https://docs.aws.amazon.com/opensearch-service/latest/developerguide/search-example.html

但它不起作用(它不想进行身份验证,"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)

,我的 lambda 函数确实与 OpenSearch 域进行通信。

我查阅了OpenSearch() 文档,但我不清楚它的参数如何映射到boto3 会话凭据和/或AWS4Auth。那么这一行应该是什么

openSearch_client = OpenSearch(hosts = [openSearch_endpoint], auth = awsauth)

是吗?

【问题讨论】:

【参考方案1】:

OpenSearch 服务需要端口 443 来接收传入请求,因此您需要在附加到您的 OpenSearch 服务域的安全组下添加新的入站规则。

试试规则:

类型:HTTPS 协议:TCP 端口范围:443 来源:0.0.0.0/0 (Anywhere-IPv4)

此外,您应该为您的 Lambda 函数制定基于资源的策略,以执行对您的 OpenSearch 服务域的请求。

【讨论】:

【参考方案2】:

实际上在几个小时后找到了解决方案:

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
        )

【讨论】:

以上是关于在 aws lambda 上使用 opensearch-py 进行 opensearch 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NodeJS 在 AWS Lambda 上运行 PhantomJS

在 AWS lambda 上运行 graphql 应用程序

如何使用AWS Lambda函数在本地系统上执行文件

如何在 AWS lambda 上使用 graphql 'isValidJSValue' 或 'coerceValue'?

如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?

如何使用 Python 在 AWS Lambda 上运行 SQLAlchemy