こんにちは!
AWSを使用したサーバーレスアプリケーション開発は、柔軟性と高い可用性を提供するために、多くのプロジェクトで採用されています。AWSのサーバーレスアプリケーションでは、IAMロールを使用したアクセス権を管理する必要があります。この記事では、Serverless IAM Roles Per Functionを使用して、Serverlessアプリケーションにおけるアクセス権の管理方法を説明します。
Serverless IAM Roles Per Functionとは、ServerlessFrameworkのLambda関数ごとに異なるIAMロールを使用してアクセス権を管理できるツールです。
AWSで開発するアプリケーションは、原則各リソースに最小権限のIAMロールを渡してあげる必要がありますので、本プラグインで各Lambda関数ごとに最適化した権限を付与することが可能となります。
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が関数レベルで定義されていない場合、デフォルトの動作が維持され、その関数はグローバルIAMロールを受け取ります。関数に空のiamRoleStatementsを定義することは可能で、その場合、関数はCloudWatchと(必要に応じて)ストリームイベントとVPCに必要な権限だけを持つ専用のロールを受け取ります。iamRoleStatementsを空にし、VPCを設定した関数を定義した例。この関数は、CloudWatchログのパーミッションとポリシーAWSLambdaVPCAccessExecutionRoleを持つカスタムロールを受け取ります。
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開発内製化はお気軽にお問い合わせください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎