serverless.yml内でIAMRoleを設定する方法を解説します。
SecretManagerからシークレットを取得する方法は、こちらを参考にしてください。
1. create
今回はNode.js&TypeScript環境で実行します。
serverless create -t aws-nodejs-typescript -n secret-sample -p ./secret-sample
2. ymlファイルへ変更
serverlessを用いてNode.js&TypeScript環境のlambda関数を作成すると、デフォルトではserverless.tsが設定ファイルとして作成されます。
typeやメソッドなどをエディタが推論してくれて便利ですが、公式や記事にはymlで書かれていることが多いので、僕はymlファイルに変更しています。
エディタやコマンドラインからRenameを行い、yml形式に変更してください。
3. serverless.yamlを編集
ひとまず完成形です。
serverless.yml
service: secret-sample
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs14.x
region: ap-northeast-1
stage: ${opt:stage, self:custom.defaultStage}
deploymentBucket:
name: ${self:provider.stage}-serverless-deployment
profile: ${self:custom.profiles.${self:provider.stage}}
versionFunctions: false
logRetentionInDays: 60
iam:
role:
statements:
- Effect: Allow
Action:
- secretsmanager:GetSecretValue
- secretsmanager:DescribeSecret
Resource:
- !Join
- ":"
- - arn
- aws
- secretsmanager
- !Ref AWS::Region
- !Ref AWS::AccountId
- secret
- order-notification-*
plugins:
- serverless-webpack
custom:
defaultStage: dev
webpack:
webpackConfig: "./webpack.config.js"
includeModules: true
profiles:
dev: k.ikeura
stg: k.ikeura-staging
prd: k.ikeura-production
otherfile:
environment:
dev: ${file(./conf/dev.yml)}
stg: ${file(./conf/stg.yml)}
prd: ${file(./conf/prd.yml)}
functions:
index:
handler: src/handler.index
environment:
SECRET_NAME: "${self:custom.otherfile.environment.${self:provider.stage}.SECRET_NAME}"
iamroleに関する設定は、以下です。
serverless.yml
iam:
role:
statements:
- Effect: Allow
Action:
- secretsmanager:GetSecretValue
- secretsmanager:DescribeSecret
Resource:
- !Join
- ":"
- - arn
- aws
- secretsmanager
- !Ref AWS::Region
- !Ref AWS::AccountId
- secret
- "${self:custom.otherfile.environment.${self:provider.stage}.SECRET_NAME}"-*
注意点
-
iam.role.statements
ではなく、iamRoleStatements:
と書いている記事がありますが、この書き方は非推奨になりました。iamRoleStatements:
のままdeployすると、warningで非推奨であるというメッセージが出るかと思います。 - Actionに
secretsmanager:DescribeSecret
を入れている理由はSecretManagerから取得する値をキャッシュ化する際に必要だからです。今回はその実装方法については説明しません。詳しくは公式を参照。 - Resouce以降はcloudformationの省略記法に習っています。詳しくはこちらの記事を参照。
これでiamroleの設定ができました。
シークレットの参照の方法ですが、今回使用した環境でaws-sdkを用いて参照する方法をこちらの記事にまとめています。