从 Lambda 在 OpenSearch AWS 中创建索引失败

问题描述 投票:0回答:1

我有一些数据需要在新的 opensearch 实例中建立索引。我之前没有使用过 opensearch,所以一直在关注 aws 网站上的教程,但在创建索引时遇到访问问题。

这就是我所做的,创建了一个具有如下属性的域

域名创建方法-轻松创建 版本 - OpenSearch 2.9 网络-公共访问 细粒度 - 创建主用户(添加用户名/密码)

就是这样

我按照此处的教程创建了 lambda 函数

来自 AWS 的教程链接

但是我没有从发电机中填充数据,而是有一个需要输入的数据列表。

除了 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 服务没有给我提供我需要的所有访问权限。我花了相当多的时间来解决这个问题,所以我将不胜感激我能在这里得到的任何帮助

非常感谢

amazon-web-services aws-lambda amazon-iam amazon-opensearch
1个回答
0
投票

您需要进行角色映射

将 Lambda 角色 ARN 作为后端角色映射到您创建的自定义角色或预定义的 OpenSearch 角色之一,这将授予您创建索引的权限,即

all_access
(无法确认,但请尝试
index_management_full_access
).

您可以通过 OpenSearch API 或通过 docs 后面的控制台来执行此操作:

  1. 复制您的 Lambda 函数执行角色 ARN
  2. 打开 OpenSearch 仪表板
  3. 选择 Security > Roles,然后选择合适的 OpenSearch 角色
  4. 选择映射的用户选项卡和管理映射
  5. 在后端角色下,粘贴复制的 ARN
  6. 单击“地图”按钮

您的 Lambda 函数现在应该有权创建 OpenSearch 索引。

© www.soinside.com 2019 - 2024. All rights reserved.