英文:
How to connect AWS OpenSearch Serverless to Lambda to inject data?
问题
我正在尝试进行PUT请求,将数据上传到我创建的集合中。然而,我收到了一个'403'错误,显示'用户没有请求的资源的权限'。
我相信我已经授予了用户完全的IAM访问权限,但仍然收到相同的错误。
这是我的IAM和serverless文件中的函数部分:
iam:
role:
statements:
- Effect: Allow
Action:
- aoss:*
Resource:
- '*'
functions:
lambdaFunction:
handler: src/controllers/lambdaFunction.handler
description: 创建一个lambda
events:
- http:
path: /lambda
method: post
cors: ${self:custom.cors-settings}
private: false
authorizer:
type: CUSTOM
authorizerId: ${self:provider.environment.authorizer_ref}
resultTtlInSeconds: 0
memorySize: 256
logRetentionInDays: 30
iamRoleStatementsInherit: true
iamRoleStatements:
- Effect: Allow
Action:
- aoss:*
Resource:
- '*'
英文:
I'm trying to do a PUT request to upload data to a collection I have created. However, I'm getting a '403' error; 'User does not have permissions for the requested resource'.
I believe I have granted full IAM access to the user but I'm still getting the same error.
Here is the IAM and function within my serverless file:
iam:
role:
statements:
- Effect: Allow
Action:
- aoss:*
Resource:
- '*'
functions:
lambdaFunction:
handler: src/controllers/lambdaFunction.handler
description: create a lambda
events:
- http:
path: /lambda
method: post
cors: ${self:custom.cors-settings}
private: false
authorizer:
type: CUSTOM
authorizerId: ${self:provider.environment.authorizer_ref}
resultTtlInSeconds: 0
memorySize: 256
logRetentionInDays: 30
iamRoleStatementsInherit: true
iamRoleStatements:
- Effect: Allow
Action:
- aoss:*
Resource:
- '*'
答案1
得分: 1
抱歉,代码部分不要翻译。以下是文本的翻译部分:
文档不太好,但首先,您需要在 Opensearch 无服务器集合中创建一个数据访问策略,其中包括以下规则:
- 主体为:您的 Lambda 角色
- 授权/权限为:基于 Lambda 应该对集合执行的操作
如果您不知道您的 Lambda 角色,您可以转到 Lambda 详细页面,然后导航到 'Configuration > Permissions',它就在页面的顶部。
之后,您应该授予 Lambda 角色执行 aoss:APIAccessAll 操作的访问策略。现在,我没有找到任何预制的访问策略,所以我创建了一个名为 OpensearchServerlessAPICaller 的新策略,其 JSON 策略如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"aoss:BatchGetCollection",
"aoss:APIAccessAll"
],
"Resource": "*"
}
]
}
一切就绪后,您的 Lambda 可以直接对 Opensearch 无服务器集合进行调用。请记得正确对使用的库的客户端进行身份验证。如果您正在使用 Node.js,我建议使用 @opensearch-project/opensearch,这意味着您应该使用以下方式创建客户端:
import { AwsSigv4Signer } from '@opensearch-project/opensearch/aws';
import { Client } from '@opensearch-project/opensearch';
import { defaultProvider } from '@aws-sdk/credential-provider-node';
const client = new Client({
node: "Your opensearch host",
...AwsSigv4Signer({
region: 'eu-central-1',
service: 'aoss',
getCredentials: () => {
const credentialsProvider = defaultProvider();
return credentialsProvider();
},
}),
});
附注:请注意,如果您选择在 VPC 中保护 Opensearch 集合,那么您应该将 Lambda 放在相同的 VPC 中,否则它将无法访问集合。
英文:
The documentation unluckily is not one of the best, but first off you need to create a data access policy inside your Opensearch Serverless collection where you add a rule with:
- as Principal: your lambda role
- as grants/permissions: based on what the lambda should do with the collection
If you don't know your lambda role, you can just go to your lambda detail page and then navigate to 'Configuration > Permissions' and its sitting right on top of that page
After that you should give to the lambda role the access policy to perform the aoss:APIAccessAll action. Now I didn't find any 'pre-made' access policy so I created a new one with name OpensearchServerlessAPICaller with the following json policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"aoss:BatchGetCollection",
"aoss:APIAccessAll"
],
"Resource": "*"
}
]
}
With everything in place now your lambda can perform calls directly to your Opensearch Serverless collection. Remember to correctly authenticate the library's client you are using. I suggest using @opensearch-project/opensearch if you are using node, which would mean that you should create the client with:
import { AwsSigv4Signer } from '@opensearch-project/opensearch/aws';
import { Client } from '@opensearch-project/opensearch';
import { defaultProvider } from '@aws-sdk/credential-provider-node'
const client = new Client({
node: "Your opensearch host",
...AwsSigv4Signer({
region: 'eu-central-1',
service: 'aoss',
getCredentials: () => {
const credentialsProvider = defaultProvider();
return credentialsProvider();
},
}),
});
Sidenote: Keep in mind that if you opted to protect your opensearch collection within a VPC then you should place the lambda within the same VPC otherwise it's not going to reach the collection.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论