LoginSignup
1
0

More than 3 years have passed since last update.

[ServerlessFramework]IAMロールの設定をserverless.yml内で行い、SecretManagerからシークレットを取得する

Posted at

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を用いて参照する方法をこちらの記事にまとめています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0