Back to Releases
v2.225.0 2025年11月17日

AWS CDK v2.225.0 リリース解説

カスタムリソースへのExternal IDサポート追加、Route53委譲の権限制限機能、DynamoDB GlobalTableの破壊的変更、および複数のバグ修正を含むリリース

custom-resourcesroute53dynamodbcognitos3-deployment

概要

AWS CDK v2.225.0 は、セキュリティ強化と機能追加を含む重要なリリースです。AwsCustomResource に External ID サポートが追加され、クロスアカウントロール引き受け時のセキュリティが向上しました。また、Route53 の grantDelegation で委譲ゾーン名を制限できるようになり、最小権限の原則に従った設定が可能になりました。さらに、DynamoDB GlobalTable には破壊的変更が含まれているため、アップグレード時には注意が必要です。

新機能

custom-resources: AwsCustomResource に External ID サポートを追加

概要

AwsCustomResource でクロスアカウントロールを引き受ける際に、External ID を指定できるようになりました。これにより、「混乱した代理人(Confused Deputy)」攻撃を防ぐための追加のセキュリティ層が提供されます。

背景

マルチアカウント環境でクロスアカウントロールを使用する場合、External ID は AWS のセキュリティベストプラクティスとして推奨されています。悪意のある第三者がサービスを騙して別のアカウントに代わってアクションを実行させる攻撃を防ぐために、ロール引き受け時に追加のシークレット値(External ID)を要求します。

実装の詳細

AwsSdkCall インターフェースに新しい externalId プロパティが追加されました。このプロパティは任意で、既存のコードとの後方互換性が保たれています。External ID は、assumedRoleArn が指定されている場合にのみ使用され、STS AssumeRole 呼び出しに渡されます。

使用例

基本的な使用方法:

import * as cr from 'aws-cdk-lib/custom-resources';
import * as iam from 'aws-cdk-lib/aws-iam';

// クロスアカウントロールで External ID を使用
const customResource = new cr.AwsCustomResource(this, 'MyCustomResource', {
  onCreate: {
    service: 'STS',
    action: 'GetCallerIdentity',
    assumedRoleArn: 'arn:aws:iam::123456789012:role/CrossAccountRole',
    // External ID を指定することで Confused Deputy 攻撃を防ぐ
    externalId: 'my-secure-external-id',
    region: 'us-east-1',
    physicalResourceId: cr.PhysicalResourceId.of('caller-identity'),
  },
  policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
    resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
  }),
});

ライフサイクル操作ごとに異なる External ID を指定:

const customResource = new cr.AwsCustomResource(this, 'MyCustomResource', {
  onCreate: {
    service: 'DynamoDB',
    action: 'PutItem',
    assumedRoleArn: 'arn:aws:iam::123456789012:role/DynamoRole',
    // 作成時の External ID
    externalId: 'create-external-id',
    parameters: {
      TableName: 'MyTable',
      Item: { id: { S: 'item1' } },
    },
    physicalResourceId: cr.PhysicalResourceId.of('dynamodb-item'),
  },
  onUpdate: {
    service: 'DynamoDB',
    action: 'UpdateItem',
    assumedRoleArn: 'arn:aws:iam::123456789012:role/DynamoRole',
    // 更新時の External ID(必要に応じて異なる ID を使用可能)
    externalId: 'update-external-id',
    parameters: {
      TableName: 'MyTable',
      Key: { id: { S: 'item1' } },
      UpdateExpression: 'SET #attr = :val',
      ExpressionAttributeNames: { '#attr': 'status' },
      ExpressionAttributeValues: { ':val': { S: 'updated' } },
    },
  },
  onDelete: {
    service: 'DynamoDB',
    action: 'DeleteItem',
    assumedRoleArn: 'arn:aws:iam::123456789012:role/DynamoRole',
    // 削除時の External ID
    externalId: 'delete-external-id',
    parameters: {
      TableName: 'MyTable',
      Key: { id: { S: 'item1' } },
    },
  },
  policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
    resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
  }),
});

セキュリティに関する注意事項

  • External ID は、クロスアカウントロール引き受け時のセキュリティを強化しますが、IAM ポリシーの適切な設定も必要です
  • External ID は秘密情報として扱い、安全に管理してください
  • 既存の assumedRoleArn 機能と完全に互換性があり、External ID はオプションです
  • 新しい IAM 権限は不要で、既存の STS AssumeRole 権限で動作します

関連リンク

route53: grantDelegation で委譲ゾーン名の制限をサポート

概要

Route53 の grantDelegation() メソッドに、委譲ロールが作成できるレコード名を制限する機能が追加されました。これにより、最小権限の原則に従ったより細かい権限制御が可能になります。

背景

マルチアカウント環境では、異なるサブドメインに対して異なるロールを使用することが一般的です。例えば、dev.example.comprod.example.com で別々のロールを使用したい場合などです。従来は、委譲ロールにホストゾーン全体への権限を付与する必要がありましたが、このリリースでは特定のサブドメインのみに権限を制限できます。

実装の詳細

新しい GrantDelegationOptions インターフェースが追加され、オプションの delegatedZoneNames プロパティが含まれています。このプロパティに指定されたゾーン名は、親ホストゾーンの有効なサブドメインであることが検証されます。

使用例

特定のサブドメインのみに委譲権限を付与:

import * as route53 from 'aws-cdk-lib/aws-route53';
import * as iam from 'aws-cdk-lib/aws-iam';

// 親ホストゾーン
const parentZone = route53.HostedZone.fromLookup(this, 'ParentZone', {
  domainName: 'example.com',
});

// 委譲先のロール
const delegationRole = new iam.Role(this, 'DelegationRole', {
  assumedBy: new iam.AccountPrincipal('123456789012'),
});

// 特定のサブドメイン(a.example.com)のみに委譲権限を付与
parentZone.grantDelegation(delegationRole, {
  // このロールは a.example.com の NS レコードのみ作成/削除可能
  delegatedZoneNames: ['a.example.com'],
});

複数のサブドメインに委譲権限を付与:

// 開発環境用のロール
const devRole = new iam.Role(this, 'DevRole', {
  assumedBy: new iam.AccountPrincipal('111111111111'),
});

// dev.example.com のみに権限を付与
parentZone.grantDelegation(devRole, {
  delegatedZoneNames: ['dev.example.com'],
});

// 本番環境用のロール
const prodRole = new iam.Role(this, 'ProdRole', {
  assumedBy: new iam.AccountPrincipal('222222222222'),
});

// prod.example.com のみに権限を付与
parentZone.grantDelegation(prodRole, {
  delegatedZoneNames: ['prod.example.com'],
});

生成される IAM ポリシー

delegatedZoneNames を指定すると、以下の条件が IAM ポリシーに追加されます:

{
  "ForAllValues:StringEquals": {
    "route53:ChangeResourceRecordSetsRecordTypes": ["NS"],
    "route53:ChangeResourceRecordSetsActions": ["UPSERT", "DELETE"],
    "route53:ChangeResourceRecordSetsNormalizedRecordNames": ["a.example.com"]
  }
}

これにより、ロールは指定されたゾーン名の NS レコードのみを作成・削除でき、他のレコードやサブドメインには影響を与えられません。

関連リンク

L1 CloudFormation リソース定義の更新

CloudFormation のスキーマ更新に伴い、多数の L1 リソース定義が更新されました。主な変更点は以下の通りです:

主要なサービス追加・更新

  • API Gateway: DomainNameDomainNameV2RestApiEndpointAccessMode プロパティを追加
  • Kinesis: StreamWarmThroughputMiBps プロパティを追加(オンデマンドストリームの温スループット設定)
  • Elastic Load Balancing v2: ListenerListenerRule に JWT 検証サポート(JwtValidationConfig)を追加
  • Glue: 新しいリソース AWS::Glue::IdentityCenterConfiguration を追加
  • MediaConnect: 新しいリソース AWS::MediaConnect::RouterNetworkInterface を追加
  • MSK: ClusterRebalancing プロパティを追加
  • Control Tower: LandingZoneRemediationTypes プロパティを追加
  • DSQL: ClusterPolicyDocument プロパティを追加
  • EC2: IPAMScopeExternalAuthorityConfiguration を追加(外部 IP 管理システムとの連携)
  • S3 Tables: TableBucketMetricsConfiguration を追加
  • Rekognition: Project にタグサポートを追加

関連リンク

バグ修正

aws-cdk-lib: 一時的な Cloud Assemblies がクリーンアップされない問題を修正

CDK がスタックを合成する際に作成される一時的な Cloud Assembly ディレクトリが適切にクリーンアップされず、ディスク容量を圧迫する問題が修正されました。これにより、長期間動作する CI/CD パイプラインや開発環境でのディスク使用量が改善されます。

関連リンク

cognito: PLUS 以外のプランでの脅威保護の検証を緩和

Cognito User Pool で、PLUS プラン以外でも基本的な脅威保護(アドバンスドセキュリティ機能の一部)を使用できるようになりました。以前は、過度に厳格な検証により、PLUS プラン以外では脅威保護を有効化できませんでしたが、この制限が緩和されました。

影響範囲

PLUS プラン以外の Cognito User Pool で基本的な脅威保護機能を使用したい場合、以下のようなコードが正常に動作するようになりました:

import * as cognito from 'aws-cdk-lib/aws-cognito';

const userPool = new cognito.UserPool(this, 'MyUserPool', {
  // PLUS プラン以外でも基本的な脅威保護を有効化可能
  advancedSecurityMode: cognito.AdvancedSecurityMode.ENFORCED,
});

関連リンク

s3-deployment: Source.jsonData() が null 値を含む JSON で失敗する問題を修正

S3 バケットに JSON データをデプロイする際、JSON に null 値が含まれているとデプロイが失敗する問題が修正されました。

影響範囲

以下のように null 値を含む JSON データをデプロイする場合に影響がありました:

import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';
import * as s3 from 'aws-cdk-lib/aws-s3';

const bucket = new s3.Bucket(this, 'MyBucket');

new s3deploy.BucketDeployment(this, 'DeployJSON', {
  sources: [
    s3deploy.Source.jsonData('config.json', {
      // null 値を含む JSON もデプロイ可能に
      setting1: 'value1',
      setting2: null, // この null 値が原因で失敗していた
      setting3: {
        nested: null,
      },
    }),
  ],
  destinationBucket: bucket,
});

関連リンク

リバート(取り消し)

dynamodb: Table.table フィールドを private に戻して .NET の命名問題を修正

以前のリリースで Table.table フィールドが public に変更されましたが、.NET での命名規則の問題により、このフィールドが private に戻されました。これは .NET ユーザーのみに影響する変更です。

関連リンク

破壊的変更

aws-dynamodb: AWS::DynamoDB::GlobalTable の ResourcePolicy プロパティが必須に

CloudFormation のスキーマ更新により、AWS::DynamoDB::GlobalTable L1 リソースの ResourcePolicy プロパティが必須になりました。

影響範囲

L1 リソース(CfnGlobalTable)を直接使用している場合、ResourcePolicy プロパティを指定する必要があります。L2 コンストラクト(Table)を使用している場合は影響ありません。

移行方法

以下のように ResourcePolicy プロパティを追加してください:

import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';

// L1 リソースを直接使用している場合
const cfnGlobalTable = new dynamodb.CfnGlobalTable(this, 'MyGlobalTable', {
  tableName: 'MyTable',
  attributeDefinitions: [
    { attributeName: 'id', attributeType: 'S' },
  ],
  keySchema: [
    { attributeName: 'id', keyType: 'HASH' },
  ],
  replicas: [
    {
      region: 'us-east-1',
      streamSpecification: {
        // ResourcePolicy が必須に
        resourcePolicy: {
          policyDocument: {
            Statement: [
              {
                Effect: 'Allow',
                Principal: { Service: 'dynamodb.amazonaws.com' },
                Action: 'dynamodb:*',
                Resource: '*',
              },
            ],
          },
        },
      },
    },
  ],
});

L2 コンストラクトを使用している場合は、内部で適切に処理されるため変更不要です:

// L2 コンストラクトを使用している場合は影響なし
const table = new dynamodb.Table(this, 'MyTable', {
  partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
  replication: [
    { region: 'us-east-1' },
    { region: 'eu-west-1' },
  ],
});

Alphaモジュール

このリリースには、Alphaモジュール(2.225.0-alpha.0)の変更が含まれていますが、リリースノートには具体的な変更内容が記載されていません。Alphaモジュールを使用している場合は、GitHub のリリースページで詳細を確認してください。

まとめ

AWS CDK v2.225.0 は、セキュリティ機能の強化と複数のバグ修正を含む重要なリリースです。

主なハイライト:

  • セキュリティ強化: AwsCustomResource の External ID サポートにより、クロスアカウント操作がより安全に
  • 権限の最小化: Route53 の grantDelegation で委譲ゾーン名を制限できるようになり、最小権限の原則を実現
  • L1 リソース更新: 多数の AWS サービスに新しいプロパティとリソースが追加
  • 破壊的変更: DynamoDB GlobalTable の L1 リソースを直接使用している場合は、ResourcePolicy プロパティの追加が必要

アップグレード時の注意点:

  • DynamoDB GlobalTable の L1 リソース(CfnGlobalTable)を使用している場合は、ResourcePolicy プロパティを追加してください
  • L2 コンストラクトを使用している場合は、破壊的変更の影響はありません

推奨事項:

  • クロスアカウントで AwsCustomResource を使用している場合は、External ID の追加を検討してください
  • Route53 でドメイン委譲を使用している場合は、delegatedZoneNames を指定して権限を最小化してください
  • 複数のバグ修正が含まれているため、アップグレードを推奨します