実行ロールを共有するLambda関数

必要な権限が異なるLambda関数では、実行ロールを分離してください。

説明

必要な権限が異なる関数で同じ実行ロールを使うと、一つの関数に必要な権限がほかの関数にも付与される可能性があります。実行ロールは、関数コードがAWSサービスへアクセスするときの権限を提供します。

処理内容と信頼境界が同じ関数でロールを共有することが、直ちに過剰なアクセスを意味するわけではありません。ロール名だけでなく、関連付けたポリシーと実際のアクセス範囲を確認してください。

想定される影響

  • 一つの関数のコードや入力が悪用されると、その関数には不要なデータや操作までアクセスされる可能性があります。
  • 共有ロールの権限変更が、それを使うほかの関数にも影響する可能性があります。

対処方法

  • 各関数に必要なAPIとリソースを整理し、権限や信頼境界が異なる場合は実行ロールを分離してください。
  • 各ロールには必要な権限だけを付与し、Lambdaサービスが引き受けられる信頼ポリシーを設定してください。共通ポリシーの再利用時も全権限を確認してください。
  • 変更後に関数の実行、ログ記録、必要なサービス呼び出しを検証してください。

例

二つの関数に関連付けるロールの比較です。ARNはLambdaを信頼する実在のロールに置き換えてください。固定応答のコードを実際のアプリケーションに変更する場合は、その処理に必要な権限も設定してください。

変更前

yaml
Resources:
  Primer01:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: nodejs22.x
      Role: arn:aws:iam::123456789012:role/lambda-role
      Handler: index.handler
      Code:
        ZipFile: |
          exports.handler = async () => ({ statusCode: 200, body: "ok" });

  Primer02:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: nodejs22.x
      Role: arn:aws:iam::123456789012:role/lambda-role
      Handler: index.handler
      Code:
        ZipFile: |
          exports.handler = async () => ({ statusCode: 200, body: "ok" });

両方の関数が同じロールを使い、そのロールに付与された権限を共有します。

変更後

yaml
Resources:
  Primer01:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: nodejs22.x
      Role: arn:aws:iam::123456789012:role/lambda-role-primer01
      Handler: index.handler
      Code:
        ZipFile: |
          exports.handler = async () => ({ statusCode: 200, body: "ok" });

  Primer02:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: nodejs22.x
      Role: arn:aws:iam::123456789012:role/lambda-role-primer02
      Handler: index.handler
      Code:
        ZipFile: |
          exports.handler = async () => ({ statusCode: 200, body: "ok" });

関数ごとに別のロールを関連付けます。アクセスを適切に分離するには、各ロールのポリシーも最小権限にする必要があります。

参考資料