Aws lambda 具有AWS4和混合身份验证类型(用户池和IAM)的AppSync

Aws lambda 具有AWS4和混合身份验证类型(用户池和IAM)的AppSync,aws-lambda,graphql,amazon-cognito,amazon-iam,aws-appsync,Aws Lambda,Graphql,Amazon Cognito,Amazon Iam,Aws Appsync,我定义了一个AppSync GraphQL API。API使用Cognito用户池作为主要身份验证。这部分很好用 我正在尝试使用axios和aws4从Nodejs Lambda函数执行请求。我要尝试的变化是在我的模式中配置类似的内容(省略了大部分模式): 我已将Lambda函数执行角色配置为具有appsync:GraphQL权限: "Action": [ "appsync:GraphQL" ], "Resource": "

我定义了一个AppSync GraphQL API。API使用Cognito用户池作为主要身份验证。这部分很好用

我正在尝试使用
axios
aws4
从Nodejs Lambda函数执行请求。我要尝试的变化是在我的模式中配置类似的内容(省略了大部分模式):

我已将Lambda函数执行角色配置为具有
appsync:GraphQL
权限:

"Action": [
  "appsync:GraphQL"
],
"Resource": "arn:aws:appsync:eu-west-2:xxxx:apis/yyyy/*",
"Effect": "Allow",
"Sid": "AllowAppSyncExecution"
从不同的在线文章中,我收集了一些请求,然后我的Nodejs Typescript函数将尝试执行这些请求:

 const doSomething = `mutation doSomething($input: SomethingInput!) {
    doSomething(input: $input) {
      someId
    }
  }`;

  const data = {
    operationName: 'doSomething',
    query: doSomething,
    variables: {
      input: { someId: 'abc' },
    },
  };
  const body = JSON.stringify(data);

  const signOptions = {
    method: 'POST',
    url: 'https://zzzz.appsync-api.eu-west-2.amazonaws.com/graphql, 
    host: 'zzzz.appsync-api.eu-west-2.amazonaws.com',
    path: '/graphql',
    region: process.env.AWS_REGION,
    service: 'appsync',
    headers: {
      'content-type': 'application/json',
    },
    body, // used by aws4
    data, // used by axios
  };

  const creds = {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    sessionToken: process.env.AWS_SESSION_TOKEN,
  };

  const signed = aws4.sign(signOptions, creds);
  delete signed.headers.Host;
  delete signed.headers['Content-Length'];

  console.log(signed);
  console.log('Got signed headers');

  try {
    await axios(signed);
  } catch (err) {
    console.error('Fialed to execute AppSync request', err);
    throw err;
  }
我总是收到一个
请求失败,状态代码401
响应返回。AppSync日志没有透露更多信息:

{
    "logType": "RequestSummary",
    "requestId": "11111111",
    "graphQLAPIId": "some id",
    "statusCode": 401,
    "latency": 7079000
}
我在正确配置时遗漏了什么?我是否需要添加一些东西来允许AWS IAM仅用于特定的突变,或者您是否发现我尝试执行请求的方式存在任何问题

以下是我提到的文章:


让它工作起来了。我必须向AWS::AppSync::GraphQLApi添加额外的身份验证提供程序。在CloudFormation中,这看起来像是一个附加属性:

  Type: AWS::AppSync::GraphQLApi
    Properties:
      Name: !Ref MyApi
      AuthenticationType: AMAZON_COGNITO_USER_POOLS
      UserPoolConfig:
        UserPoolId: !Ref MyPool
        AwsRegion: !Ref MyRegion
        DefaultAction: ALLOW
      AdditionalAuthenticationProviders:
        - AuthenticationType: AWS_IAM
完成此操作后,我从AppSync GraphQL获得了一个响应,但它包含响应对象中所有字段的GraphQL错误:

无权在键入Something时访问someId

为了解决这个问题,我还必须在GraphQL模式中允许对这种类型使用IAM:

type Something @aws_cognito_user_pools @aws_iam {
  someId: ID!
}
type Something @aws_cognito_user_pools @aws_iam {
  someId: ID!
}