Serverless FrameworkでIAMロールを使ってデプロイしようとしてハマったときのメモ。
結論としては、.aws/configだけではなく、.aws/credentialsにもrole_arnとsource_profileの設定をすればOK。
環境
Serverless Framework
$ serverless --version
Framework Core: 1.69.0
Plugin: 3.6.9
SDK: 2.3.0
Components: 2.30.5
AWSのconfigとcredentials
assume roleしてadmin権限でcli実行するprofileを下記のように設定。
$ cat ~/.aws/config
[default]
region = ap-northeast-2
output = json
[profile admin]
region = ap-northeast-2
role_arn = arn:aws:iam::NNNNNNNNNNNN:role/xxxxxxxx-yyyyyyyy
source_profile = default
credentialsファイルはdefaultのみ、下記のように設定。
$ cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Terminalからaws cliコマンドを直接実行する分には、この設定で問題ない。
現象
serverless frameworkを使って、AWS Lambdaのデプロイを試みると、profileが見つからないエラーが表示されて、処理が中断する。参照して欲しいprofileは--aws-profileで設定しているはずなのに...。
serverless deploy --aws-profile admin
Error --------------------------------------------------
Error: Profile admin does not exist
at Object.addProfileCredentials (/Users/shizuku/.nodebrew/node/v12.16.2/lib/node_modules/serverless/lib/plugins/aws/provider/awsProvider.js:102:15)
at AwsProvider.getCredentials (/Users/shizuku/.nodebrew/node/v12.16.2/lib/node_modules/serverless/lib/plugins/aws/provider/awsProvider.js:3
...
対策
awsのcredentialsファイルの方にも、configファイルと同様のプロファイル名のエントリを追記して、role_arnとsource_profileを記載する。
$ cat ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
[admin]
region = ap-northeast-2
role_arn = arn:aws:iam::NNNNNNNNNNNN:role/xxxxxxxx-yyyyyyyy
source_profile = default