概要
標題の通りですが、Serverless Framework 1.10.2において、serverless.ymlにAWS IAM変数(${cognito-identity.amazonaws.com:sub}
など)を使用する場合、
フレームワークの挙動として${文字列}
の値を設定した変数に置き換えようとする動きをするので、その挙動を変更し、IAM変数を使えるようにする方法を書きます。
※今回はcognito-identity.amazonaws.com:subに限定して書きますので、汎用的ではありません。
元のコード
provider: name: aws runtime: nodejs6.10 stage: dev region: us-west-2 iamRoleStatements: - Effect: "Allow" Action: - "s3:PutObject" Resource: "arn:aws:s3:::mybucket/${self:provider.stage}/${cognito-identity.amazonaws.com:sub}/*"
このような感じで、自分のcognito identityに紐づいたs3 bucketしか触らせないようにするIAM Roleを記述し、
sls deploy -v
した場合、
Serverless Error --------------------------------------- Invalid variable reference syntax for variable cognito-identity.amazonaws.com. You can only reference env vars, options, & files. You can check our docs for more info.
こんな感じで怒られます。 そんな変数ねーよって感じですね。
そこで、ここの処理をどうしているのか追っていったところ
variableSyntax
という名の、それっぽものがありました。
さらに調べると、provider
ブロックの直下にvariableSyntax
を記述すると、記述した値でオーバーライドされとのことでした。
正直正規表現で全てのパターンを網羅するの気合いがなかったので、cognitoに限定した正規表現を作りました。
修正前: variableSyntax: '\\${([ :a-zA-Z0-9._,\\-\\/\\(\\)]+?)}'
修正後: variableSyntax: "\\${([^cognito*+][ :a-zA-Z0-9._,\\-\\/\\(\\)]+?)}"
単純ですね。cognito*+だった場合は対象から除外しているだけです。
修正後のコード
provider: name: aws variableSyntax: "\\${([^cognito*+][ :a-zA-Z0-9._,\\-\\/\\(\\)]+?)}" runtime: nodejs6.10 stage: dev region: us-west-2 iamRoleStatements: - Effect: "Allow" Action: - "s3:PutObject" Resource: "arn:aws:s3:::mybucket/${self:provider.stage}/${cognito-identity.amazonaws.com:sub}/*"
これで、deployし、AWS マネジメントコンソールのIAM > Roles > Review Policyで確認しましょう。
意図した通りの挙動になっていますね。