AWS CDK の L2 Construct でリソースの依存関係を明示する

やりたいこと

AWS CDK の L2 Construct でリソースの依存関係を明示したい場合があります。
私の場合は、以下のようなカスタムリソースを記述していた時に依存関係の明示が必要になりました。

from aws_cdk import CustomResource

...

        # 1. AWS Organizations: すべての機能の有効化
        enable_all_features = CustomResource( 'EnableAllFeatures',
            service_token=custom_resource_provider.service_token,
            properties={
                'ClassName': 'EnableAllFeatures',
            }
        )

        # 2. AWS Organizations: Service Control Policy の有効化
        enable_policy_types = CustomResource( 'EnablePolicyTypes',
            service_token=custom_resource_provider.service_token,
            properties={
                'ClassName': 'EnablePolicyTypes',
                'PolicyTypes': ','.join([
                    'SERVICE_CONTROL_POLICY',
                ])
            }
        )

AWS Organizations の話は本筋とは異なるため詳細を省きますが、
カスタムリソースで以下の処理を実施しようとしていました。

  1. すべての機能の有効化
  2. Service Control Policy の有効化

この処理には依存関係があり、1 -> 2 の順で実施する必要があります。
ただし CustomResource のような L2 Construct には
L1 Construct (CfnXXXX) のような add_dependency メソッドが無いため、以下のような書き方は出来ません。

        # 1. AWS Organizations: すべての機能の有効化
        enable_all_features = CustomResource( 'EnableAllFeatures',
            service_token=custom_resource_provider.service_token,
            properties={
                'ClassName': 'EnableAllFeatures',
            }
        )

        # 2. AWS Organizations: Service Control Policy の有効化
        enable_policy_types = CustomResource( 'EnablePolicyTypes',
            service_token=custom_resource_provider.service_token,
            properties={
                'ClassName': 'EnablePolicyTypes',
                'PolicyTypes': ','.join([
                    'SERVICE_CONTROL_POLICY',
                ])
            }
        )
        enable_policy_types.add_dependency(enable_all_features)

解決方法

以下のように node.add_dependency() とすることで依存関係を明示できました。

        # 1. AWS Organizations: すべての機能の有効化
        enable_all_features = CustomResource( 'EnableAllFeatures',
            service_token=custom_resource_provider.service_token,
            properties={
                'ClassName': 'EnableAllFeatures',
            }
        )

        # 2. AWS Organizations: Service Control Policy の有効化
        enable_policy_types = CustomResource( 'EnablePolicyTypes',
            service_token=custom_resource_provider.service_token,
            properties={
                'ClassName': 'EnablePolicyTypes',
                'PolicyTypes': ','.join([
                    'SERVICE_CONTROL_POLICY',
                ])
            }
        )
        enable_policy_types.node.add_dependency(enable_all_features)

以下を参考にさせていただきました。

How can I create a DependsOn relation between EC2 and RDS using aws-cdk

投稿者プロフィール

sato
2015年8月入社。弊社はインフラ屋ですが、アプリも作ってみたいです。