コンテンツにスキップ

AWS CloudFormation による Environment リソース追加モデリング

CLI で "Addon" と呼ばれる追加の AWS リソースは、Service または Environment の Manifest がデフォルトで統合しない、任意の追加の AWS サービスです。 例えば Addon は、Service が読み取りまたは書き込みを必要とする DynamoDB テーブル、S3 バケット、または RDS Aurora Serverless クラスターとすることができます。

ワークロード (Load Balanced Web ServiceScheduled Job など) の追加リソースを定義することができます。 ワークロードの Addon のライフサイクルは、ワークロードによって管理され、ワークロードが削除されると削除されます。

または、Environment に対して追加の共有可能なリソースを定義することができます。 Environment Addon は、Environment が削除されない限り、削除されることはありません。

このページでは、Environment レベルの Addon を作成する方法を説明します。 ワークロードレベル Addon については、AWS CloudFormation によるワークロードリソース追加モデリング を参照してください。

どのように S3 バケット、DDB テーブル、Aurora Serverless クラスターを追加するのか?

Copilot には、特定の種類の Addon を作成するのに役立つ以下のコマンドが用意されています。

  • storage init は、DynamoDB テーブル、S3 バケット、または Aurora Serverless クラスター

ワークスペースから copilot storage init を実行すると、これらのリソースをセットアップするのに役立ついくつかの質問をガイドしてくれます。

他のリソースを追加するには?

他の種類の Addon については、独自のカスタム CloudFormation テンプレートを追加することができます。

  1. カスタムテンプレートは、ワークスペースの copilot/environments/addons ディレクトリに格納することができます。
  2. copilot env deploy を実行すると、カスタムアドオンのテンプレートが Environment スタックと一緒にデプロイされます。
Environment Addon によるワークスペースのレイアウト例
.
└── copilot
    └── environments
        ├── addons  # Environment Addon の格納
        │   └── mys3.yaml
        ├── dev
        └── prod

Addon テンプレートとはどのようなものか?

Environment Addon テンプレートは、以下を満たす有効な CloudFormation テンプレートであれば、どのようなものでも使用可能です。

  • 少なくとも 1 つの Resource が含まれる。
  • Parameters セクションに AppEnv が含まれる。

リソースプロパティは、ConditionsMappings を使ってカスタマイズすることができます。

Amazon IAM のベストプラクティスに従って、追加リソースの AWS Managed Policies を定義することをお勧めします。

Parameters セクションの書き方

Copilot では、テンプレートに定義する必要があるパラメータがいくつかあります。

Parameters:
    App:
        Type: String
    Env:
        Type: String

Parameters セクションのカスタマイズ

Copilot が必要とするパラメータ以外にパラメータを定義したい場合は、addons.parameters.yml ファイルを使用して定義することができます。

.
└── addons/
    ├── template.yml
    └── addons.parameters.yml # このファイルは addons/ ディレクトリの下に追加します。
  1. テンプレートファイルの Parameters セクションに、追加のパラメータを追加します。
  2. addons.parameters.yml にて、これらの追加パラメータの値を定義します。これらは、Environment スタックの値を参照することができます。
例: Addon パラメータのカスタマイズ

# "environments/addons/my-addon.yml" にて
Parameters:
  # AWS Copilotで必要なパラメータ
  App:
    Type: String
  Env:
    Type: String
  # addons.parameters.yml で定義された追加パラメータ
  ClusterName:
    Type: String
# "environments/addons/addons.parameters.yml" にて
Parameters:
    ClusterName: !Ref Cluster

ConditionsMappings セクションの書き方

Addon リソースを特定の条件に応じて異なるように設定したい場合がよくあります。 例えば、DB リソースのキャパシティを、デプロイ先が本番環境かテスト環境かによって、条件付きで設定することができます。 これを行うには、Conditions セクションと Mappings セクションを使用します。

例: Addon を条件付きで設定
Mappings:
    MyAuroraServerlessEnvScalingConfigurationMap:
        dev:
            "DBMinCapacity": 0.5
            "DBMaxCapacity": 8
        test:
            "DBMinCapacity": 1
            "DBMaxCapacity": 32
        prod:
            "DBMinCapacity": 1
            "DBMaxCapacity": 64
Resources:
    MyCluster:
        Type: AWS::RDS::DBCluster
        Properties:
            ScalingConfiguration:
                MinCapacity: !FindInMap
                    - MyAuroraServerlessEnvScalingConfigurationMap
                    - !Ref Env
                    - DBMinCapacity
                MaxCapacity: !FindInMap
                    - MyAuroraServerlessEnvScalingConfigurationMap
                    - !Ref Env
                    - DBMaxCapacity
Conditions:
  IsProd: !Equals [!Ref Env, "prod"]

Resources:
  MyCluster:
    Type: AWS::RDS::DBCluster
    Properties:
      ScalingConfiguration:
          MinCapacity: !If [IsProd, 1, 0.5]
          MaxCapacity: !If [IsProd, 8, 64]

Outputs セクションの書き方

Outputs セクションを使用して、他のリソース、例えば Service、CloudFormation スタックなどで使用できる任意の値を定義することができます。

Environment Addon: ワークロードに接続する

Environment Addon からの値は、ワークロード Addon またはワークロード Manifest から参照することができます。 これを行うには、まず Outputs セクションを使用して Environment Addon から値をエクスポートする必要があります。

例: Environment Addon からの値のエクスポート
Outputs:
    MyTableARN:
        Value: !GetAtt ServiceTable.Arn
        Export:
            Name: !Sub ${App}-${Env}-MyTableARN  # この値は、ワークロード Manifest またはワークロード Addon によって使用されることがあります。
    MyTableName:
        Value: !Ref ServiceTable
        Export:
            Name: !Sub ${App}-${Env}-MyTableName

Export ブロックを追加することが重要です。 そうしなければ、ワークロードスタックやワークロード Addon がその値にアクセスできなくなります。 ワークロードレベルのリソースから値を参照するには、Export.Name を使用します。

検討事項: 名前空間 Export.Name の使用

Export.Nameには、好きな名前を指定することができます。 つまり、!Sub ${App}-${Env}というプレフィックスを付ける必要はなく、単にMyTableName` とすることもできます。

しかし、AWS のリージョン内では、Export.Name は一意でなければなりません。 つまり、us-east-1MyTableName というエクスポート名を重複して持つことはできません。

したがって、名前衝突の可能性を減らすために、${App}${Env} で名前空間を指定してエクスポートすることをお勧めします。 またこれにより、その値がどの Application と Environment の下で管理されているかが明確になります。

名前空間では、例えば Application 名が "my-app" で、Environment test で Addon をデプロイしたとすると、最終的なエクスポート名は my-app-test-MyTableName となります。

ワークロード Addon からの参照

ワークロード Addon では、値がエクスポートされている限り、Environment Addon から値を参照することができます。 これを行うには、Environment Addon から値をインポートするために、その値のエクスポート名で Fn::ImportValue 関数を使用します。

例: Environment レベルの DynamoDB テーブルにアクセスするための IAM ポリシー
Parameters:
  App:
    Type: String
    Description: Your application's name.
  Env:
    Type: String
    Description: The environment name your service, job, or workflow is being deployed to.
  Name:
    Type: String
    Description: Your workload's name.
Resources:
  MyTableAccessPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      Description: Grants CRUD access to the Dynamo DB table
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Sid: DDBActions
            Effect: Allow
            Action:
              - dynamodb:* # NOTE: 実際の Application でパーミッションをスコープダウンしてください。これは、この例があまり長くならないようにするための記述です。
            Resource: 
              Fn::ImportValue:                # <- Environment Addon からテーブル ARN をインポート
                !Sub ${App}-${Env}-MyTableARN # <- 使用するエクスポート名
ワークロード Manifest からの参照

また、Environment Addon から variablessecretssecurity_groups のワークロード Manifest で、その値がエクスポートされている限り、その値を参照することができます。 これを行うには、ワークロード Manifest でその値のエクスポート名を持つ from_cfn フィールドを使用します。

例: from_cfn の使用
name: db-front
type: Backend Service

secrets:
  MY_CLUSTER_CREDS:
    from_cfn: ${COPILOT_APPLICATION_NAME}-${COPILOT_ENVIRONMENT_NAME}-MyClusterSecret
name: db-front
type: Backend Service

security_groups:
    - from_cfn: ${COPILOT_APPLICATION_NAME}-${COPILOT_ENVIRONMENT_NAME}-MyClusterAllowedSecurityGroup

Environment Addon のウォークスルー

v1.25.0 のブログ記事で詳しい解説をご覧ください。