😇
Amplify Function (Lambda) からAppSyncを叩こうとしたときに401 Unauthorizedが返ってくる
AmplifyのFunction (Lambda)からAppSyncを利用する際、401 Unauthorizedが返ってくるケースがありました。そのときに対処したログを残しておきます。
CloudFormationに詳しくなくて根本原因はわかっていないので、最適解であるかはわかりません。
環境
- PC: macOS Big Sur (11.2.3)
- Amplify CLI: ver 4.45.2
- Lambda Runtime: Node.js 14.x
エラー内容
1. Amplifyで設定
Amplify CLIでfunctionを作る際または更新する際の設定で、API(AppSync)へのcreate権限をつけました。
? Which setting do you want to update? Resource access permissions
? Select the categories you want this function to have access to. api
? Select the operations you want to permit on cheersake create
2. 401 Unauthorized
このままLambda内でAppSyncを叩くと、401 Unauthorizedが返ってきます。AppSyncから返ってくるエラーは以下のようでした。
{
"graphQLErrors": [
{
"path": ["<フィールド名>"],
"data": null,
"errorType": "Unauthorized",
"errorInfo": null,
"locations": [{ "line": 2, "column": 3, "sourceName": null }],
"message": "Not Authorized to access <メソッド名> on type Mutation"
},
{
"path": ["<フィールド名>"],
"data": null,
"errorType": "Unauthorized",
"errorInfo": null,
"locations": [{ "line": 7, "column": 3, "sourceName": null }],
"message": "Not Authorized to access <メソッド名> on type Mutation"
}
],
"networkError": null,
"message": "GraphQL error: Not Authorized to access <メソッド名> on type Mutation\\nGraphQL error: Not Authorized to access <メソッド名> on type Mutation"
}
対処
Functionのxxxxxx-cloudformation-template.json
を以下のように変更することで同じエラーが起きなくなりました。
PolicyDocumentのStatementの中身を変えています。
Before
xxxxxx-cloudformation-template.json
{
...
"Resources": {
...
"AmplifyResourcesPolicy": {
"DependsOn": ["LambdaExecutionRole"],
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "amplify-lambda-execution-policy",
"Roles": [
{
"Ref": "LambdaExecutionRole"
}
],
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["appsync:GraphQL"],
"Resource": [
{
"Fn::Join": [
"",
[
"arn:aws:appsync:",
{
"Ref": "AWS::Region"
},
":",
{
"Ref": "AWS::AccountId"
},
":apis/",
{
"Ref": "apicheersakeGraphQLAPIIdOutput"
},
"/types/create/*"
]
]
}
]
}
]
}
}
}
}
}
After
xxxxxx-cloudformation-template.json
{
...
"Resources": {
...
"AmplifyResourcesPolicy": {
"DependsOn": [
"LambdaExecutionRole"
],
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "amplify-lambda-execution-policy",
"Roles": [
{
"Ref": "LambdaExecutionRole"
}
],
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"appsync:Create*",
"appsync:StartSchemaCreation",
"appsync:GraphQL"
],
"Resource": [
{
"Fn::Join": [
"",
[
"arn:aws:appsync:",
{
"Ref": "AWS::Region"
},
":",
{
"Ref": "AWS::AccountId"
},
":apis/",
{
"Ref": "apicheersakeGraphQLAPIIdOutput"
},
"/*"
]
]
}
]
}
]
}
}
}
}
}
Discussion