AWS CDK の BucketDeployment が作成するカスタムリソース Lambda の Amazon Inspector 検出を抑制する

AWS CDK の BucketDeployment が作成するカスタムリソース Lambda の Amazon Inspector 検出を抑制する

2026.05.14

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の BucketDeployment コンストラクトは、S3 バケットへのファイルデプロイを実現するために内部で Lambda カスタムリソースを自動的に作成します。Amazon Inspector はこの Lambda 関数もスキャン対象にするため、依存ライブラリの脆弱性(Package Vulnerability)やコードの脆弱性(Code Vulnerability)が検出されることがあります。

しかし、この Lambda 関数は CDK によって管理される内部リソースのため、開発者が自由にパッチを当てることは難しく、基本的には CDK パッケージ側の対応を待つ必要があります。本記事では、CDK を使って Amazon Inspector の抑制ルール(AWS::InspectorV2::Filter)をコードで定義し、このカスタムリソース Lambda の検出結果を自動的に抑制する実装を紹介します。

BucketDeployment の内部 Lambda とは

BucketDeployment は、ローカルファイルや S3 オブジェクトを S3 バケットにデプロイするための CDK コンストラクトです。デプロイ処理は Custom::CDKBucketDeployment という Lambda カスタムリソースによって実行されます。

CDK スタックをデプロイすると、CloudFormation 上に AWS::Lambda::Function リソースが作成されていることが確認できます。


CloudFormation の Sample スタックリソースを「CDKBucketDeployment」で絞り込むと、BucketDeployment が内部で作成する Lambda 関数(AWS::Lambda::Function)が確認できる

この Lambda 関数のランタイム(Python)や依存ライブラリのバージョンは CDK のリリースに紐づいており、開発者が直接変更することはできません。

Amazon Inspector による検出結果

BucketDeployment を含む CDK スタックをデプロイすると、Amazon Inspector が Lambda 関数をスキャンします。今回の検証環境では、以下のような High 重大度の検出結果が確認されました。

タイトル タイプ 重大度
CWE-117,93 - Log injection Code Vulnerability High
GHSA-mf9v-mfxr-j63j - urllib3 Package Vulnerability High
GHSA-qccp-gfcp-xxvc - urllib3 Package Vulnerability High

重大度は High ですが、この Lambda はデプロイ時にのみ実行されるカスタムリソースであるため、外部からの攻撃に晒されるリスクは低いと言えます。とはいえ検出結果としてノイズになるため、Inspector の抑制ルールで管理します。もちろん、扱うデータのセンシティブさやシステムのクリティカルさに応じて、抑制の要否は適切に判断してください。

実装

CfnFilterAWS::InspectorV2::Filter)リソースを CDK で定義します。filterAction: "SUPPRESS" を指定し、filterCriteria.lambdaFunctionName に対象 Lambda 関数名を EQUALS 条件で指定します。

lib/sample-stack.ts
import * as cdk from "aws-cdk-lib";
import * as inspectorv2 from "aws-cdk-lib/aws-inspectorv2";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as s3 from "aws-cdk-lib/aws-s3";
import * as s3deploy from "aws-cdk-lib/aws-s3-deployment";
import { Construct } from "constructs";

export class SampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    /** BucketDeployment の対象バケット */
    const sampleBucket = new s3.Bucket(this, "SampleBucket", {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });

    /** BucketDeployment */
    const deployment = new s3deploy.BucketDeployment(this, "SampleDeployment", {
      sources: [s3deploy.Source.data("sample.txt", "Hello, World!")],
      destinationBucket: sampleBucket,
    });

    /** BucketDeployment の内部 Lambda */
    const deploymentHandler = deployment.node.findChild(
      "CustomResourceHandler"
    ) as lambda.IFunction;

    /** Inspector 抑制フィルター */
    new inspectorv2.CfnFilter(this, "SuppressInspectorForDeploymentLambda", {
      name: "suppress-bucket-deployment-lambda",
      filterAction: "SUPPRESS",
      filterCriteria: {
        lambdaFunctionName: [
          {
            comparison: "EQUALS",
            value: deploymentHandler.functionName,
          },
        ],
      },
    });
  }
}

deployment.node.findChild("CustomResourceHandler") のポイントを補足します。BucketDeployment コンストラクトはコンストラクトツリー上で CustomResourceHandler という論理 ID で Lambda 関数を作成します。node.findChild() でその参照を取得し、functionName プロパティを Inspector のフィルター条件に渡すことで、CDK デプロイ時に解決される実際の Lambda 関数名を抑制ルールに設定できます。

動作確認

抑制ルールなしの場合

CfnFilter を含まない状態でデプロイすると、Amazon Inspector が Lambda 関数の脆弱性を検出し、3 件が ACTIVE(抑制されていない)状態になります。

$ aws inspector2 list-findings \
  --filter-criteria '{"lambdaFunctionName":[{"comparison":"EQUALS","value":"Sample-CustomCDKBucketDeployment8693BB64968944B69A-9eRaNHrRpB5F"}]}' \
  --query 'findings[].{Title:title,Status:status}'
[
    { "Title": "CWE-117,93 - Log injection",     "Status": "ACTIVE" },
    { "Title": "GHSA-mf9v-mfxr-j63j - urllib3", "Status": "ACTIVE" },
    { "Title": "GHSA-qccp-gfcp-xxvc - urllib3", "Status": "ACTIVE" }
]

マネジメントコンソールからも確認できます。


抑制ルール適用前:3 件の High 検出結果が Active 状態で表示される

抑制ルールありの場合

CfnFilter を追加してデプロイすると、CloudFormation が AWS::InspectorV2::Filter を作成します。

Sample | CREATE_IN_PROGRESS | AWS::InspectorV2::Filter | SuppressInspectorForDeploymentLambda
Sample | CREATE_COMPLETE    | AWS::InspectorV2::Filter | SuppressInspectorForDeploymentLambda

同じコマンドで確認すると、3 件すべてが SUPPRESSED に変わっています。

$ aws inspector2 list-findings \
  --filter-criteria '{"lambdaFunctionName":[{"comparison":"EQUALS","value":"Sample-CustomCDKBucketDeployment8693BB64968944B69A-9eRaNHrRpB5F"}]}' \
  --query 'findings[].{Title:title,Status:status}'
[
    { "Title": "CWE-117,93 - Log injection",     "Status": "SUPPRESSED" },
    { "Title": "GHSA-mf9v-mfxr-j63j - urllib3", "Status": "SUPPRESSED" },
    { "Title": "GHSA-qccp-gfcp-xxvc - urllib3", "Status": "SUPPRESSED" }
]

マネジメントコンソールからも確認できます。


抑制ルール適用後:Active な検出結果が 0 件になる

作成された抑制ルールは aws inspector2 list-filters でも確認できます。

$ aws inspector2 list-filters
{
    "filters": [
        {
            "name": "suppress-bucket-deployment-lambda",
            "action": "SUPPRESS",
            "criteria": {
                "lambdaFunctionName": [
                    {
                        "comparison": "EQUALS",
                        "value": "Sample-CustomCDKBucketDeployment8693BB64968944B69A-9eRaNHrRpB5F"
                    }
                ]
            }
        }
    ]
}

おわりに

AWS CDK の BucketDeployment が作成するカスタムリソース Lambda の Amazon Inspector 検出を、CDK で抑制してみました。

BucketDeployment の Lambda は使用しているライブラリの関係からか、頻繁に脆弱性が検出されます。放置するとアラート疲れの原因になりますが、今回の実装を使えばそれを回避できます。

以上

この記事をシェアする

関連記事