AWS Lambdaの処理でGoogle Workspace内のスプレッドシートにアクセスする際、タイトルのようにエラーがでました。エラーメッセージの全文は以下のとおりです。
“The size of mapped attribute google.subject exceeds the 127 bytes limit. Either modify your attribute mapping or the incoming assertion to produce a mapped attribute that is less than 127 bytes.”
今回はその解決方法について記録します。
なお、前提としてWorkload Identityについての設定内容や手順はこちらです。設定内容に差異がある場合は結果も異なると思うので、比較参考にしてください。
エラー原因
まずこのエラーの原因ですが、Workload Identity連携している環境下で、Lambda実行のIAMロール名が長すぎることでこのエラーが発生します。
GCP側の観点で言えば、SSOにおいてgoogle.subjectが長すぎるためinvalid_requestを返している状態です。
ここで渡される値がIAMロール名です。SAM CLIを使って設定する場合、明示的に指定していないとデフォルトで関数名やIDなどがついた長いロール名になってしまうため、このエラーが起きやすくなっています。
解決方法
一番簡単な解決方法は、IAMロールを短い名前に設定することです。
template.yamlに以下のような形でロール名を設定できます。
Resources:
LambdaFunctionRole:
Type: AWS::IAM::Role
Properties:
RoleName: {任意の短いロール名}
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
...
LambdaFunction:
...
Properties:
...
Role: !GetAtt LambdaFunctionRole.Arn
...
あとは元々関数の方で指定していたポリシーなどをこっちに移すなど上手いこと調整すれば完了です。
まとめ
エラーメッセージを読んで「google.subjectが長いと言われても何を変更すればいいんだ」となってしまったので、備忘録を兼ねて解説しました。
少しでも調査対応の手間を減らせられれば幸いです。