我有一些数据需要在新的 opensearch 实例中建立索引。我之前没有使用过 opensearch,所以一直在关注 aws 网站上的教程,但在创建索引时遇到访问问题。
这就是我所做的,创建了一个具有如下属性的域
域名创建方法-轻松创建 版本 - OpenSearch 2.9 网络-公共访问 细粒度 - 创建主用户(添加用户名/密码)
就是这样
我按照此处的教程创建了 lambda 函数
但是我没有从发电机中填充数据,而是有一个需要输入的数据列表。
除了 lambda 基本执行之外,我还创建了 python lambda 代码,添加了以下策略
AmazonESFullAccess AmazonOpenSearchServiceFullAccess
我的代码如下所示
import boto3
import re
import requests
from requests_aws4auth import AWS4Auth
from data_to_index import bulk_data_to_index
region = 'ap-south-1' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'my_domain' # the OpenSearch Service domain, e.g. https://search-mydomain.us-west-1.es.amazonaws.com
index = 'my_index'
datatype = '_doc'
url = host + '/' + index + '/' + datatype
headers = { "Content-Type": "application/json" }
# Lambda execution starts here
def lambda_handler(event, context):
for data in bulk_data_to_index:
document = {
"key1": data[1],
"key2": data[2],
"data": ', '.join(data)
}
r = requests.post(url, auth=awsauth, json=document, headers=headers)
# Print response content and status code
print("Response Content:", r.content)
print("Status Code:", r.status_code)
# Check if the request was successful
if r.status_code == 201:
print("Document added successfully to OpenSearch!")
else:
print("Failed to add document to OpenSearch. Status code:", r.status_code)
print("Error Response:", r.text)
运行此程序时,我收到错误
响应内容:b'{"error":{"root_cause":[{"type":"security_exception","reason":"[indices:data/write/index]和用户[name=my_lambda_role]没有权限, backend_roles=[my_lambda_role],requestedTenant=null]"}],"type":"security_exception","reason":"[indices:data/write/index] 和用户 [name=my_lambda_role, backend_roles=[my_lambda_role] 没有权限], requestTenant=null]"},"状态":403}'
我不明白为什么 FullAccessToOpenSearch 服务没有给我提供我需要的所有访问权限。我花了相当多的时间来解决这个问题,所以我将不胜感激我能在这里得到的任何帮助
非常感谢
您需要进行角色映射。
将 Lambda 角色 ARN 作为后端角色映射到您创建的自定义角色或预定义的 OpenSearch 角色之一,这将授予您创建索引的权限,即
all_access
(无法确认,但请尝试 index_management_full_access
).
您可以通过 OpenSearch API 或通过 docs 后面的控制台来执行此操作:
您的 Lambda 函数现在应该有权创建 OpenSearch 索引。