Serverless IAM Roles Per Functionの基礎:Serverlessアプリケーションにおけるアクセス権の管理方法

Serverless IAM Roles Per Functionの基礎:Serverlessアプリケーションにおけるアクセス権の管理方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!

AWSを使用したサーバーレスアプリケーション開発は、柔軟性と高い可用性を提供するために、多くのプロジェクトで採用されています。AWSのサーバーレスアプリケーションでは、IAMロールを使用したアクセス権を管理する必要があります。この記事では、Serverless IAM Roles Per Functionを使用して、Serverlessアプリケーションにおけるアクセス権の管理方法を説明します。

Serverless IAM Roles Per Functionとは

Serverless IAM Roles Per Functionとは、ServerlessFrameworkのLambda関数ごとに異なるIAMロールを使用してアクセス権を管理できるツールです。

AWSで開発するアプリケーションは、原則各リソースに最小権限のIAMロールを渡してあげる必要がありますので、本プラグインで各Lambda関数ごとに最適化した権限を付与することが可能となります。

Serverless IAM Roles Per Functionの使い方

Serverless IAM Roles Per Functionを使用するには、まずServerless Frameworkをインストールして、サーバーレスアプリケーションを構築する必要があります。

npm install --save-dev serverless

次に、Serverless IAM Roles Per Functionを使用して、関数ごとに異なるIAMロールを設定します。

npm install --save-dev serverless-iam-roles-per-function
# 次の次期バージョンを試す場合
npm install --save-dev serverless-iam-roles-per-function@next
plugins:
  - serverless-iam-roles-per-function

functions:
  func1:
    handler: handler.get
    iamRoleStatementsName: my-custom-role-name #optional custom role name setting instead of the default generated one
    iamRoleStatements:
      - Effect: "Allow"        
        Action:
          - dynamodb:GetItem        
        Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/mytable"
    ...
  func2:
    handler: handler.put    
    iamRoleStatements:
      - Effect: "Allow"        
        Action:
          - dynamodb:PutItem        
        Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/mytable"
    ...

このプラグインは、iamRoleStatementsの定義がある各機能に対して、専用のロールを作成します。CloudWatchログ、ストリームイベント、VPCが定義されている場合の作成と書き込みの権限が自動的に含まれます。例えばVPCを設定している場合は、AWSLambdaVPCAccessExecutionRoleも含まれます(プロバイダレベルでiamRoleStatementsを使用する場合と同様)。

iamRoleStatementsが未定義の場合は?

iamRoleStatementsが関数レベルで定義されていない場合、デフォルトの動作が維持され、その関数はグローバルIAMロールを受け取ります。関数に空のiamRoleStatementsを定義することは可能で、その場合、関数はCloudWatchと(必要に応じて)ストリームイベントとVPCに必要な権限だけを持つ専用のロールを受け取ります。iamRoleStatementsを空にし、VPCを設定した関数を定義した例。この関数は、CloudWatchログのパーミッションとポリシーAWSLambdaVPCAccessExecutionRoleを持つカスタムロールを受け取ります。

生成されるIAMロールの名称規則は?

IAMロールの命名規則として、Serverless Frameworkで使用されている命名規則と同様のものを使用しています。

<service-name>-<stage>-<function-name>-<region>-lambdaRole

AWSではIAMロール名に64文字の制限があります。デフォルトの名前が 64 文字を超えた場合、プラグインはサフィックス -lambdaRole を削除して名前を短くします。それでも 64 文字を超える場合は、次のようなメッセージを含むエラーがスローされます。

auto generated role name for function: ${functionName} is too long (over 64 chars).
Try setting a custom role name using the property: iamRoleStatementsName.

この場合、iamRoleStatementsNameプロパティを使用してロール名を設定する必要があります。

functions:
  func1:
    handler: handler.get
    iamRoleStatementsName: my-custom-role-name 
    iamRoleStatements:
      - Effect: "Allow"        
        Action:
          - dynamodb:GetItem        
        Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/mytable"
    ...

まとめ

本記事では、Serverless IAM Roles Per Functionを使用して、ServerlessアプリケーションにおけるLambda関数のアクセス権の管理方法を説明しました。Serverless IAM Roles Per Functionを使用することで、関数ごとに異なるアクセス権を設定することが可能になります。

サーバーレス開発低コストなAWS開発内製化はお気軽にお問い合わせください。