コンテンツにスキップ

AWS CloudFormation によるワークロードリソース追加モデリング

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

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

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

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

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

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

  • storage init は DynamoDB テーブル、S3 バケット、Aurora Serverless クラスターのいずれかを作成します。

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

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

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

  1. カスタムテンプレートは、ワークスペースの copilot/<workload>/addons ディレクトリに格納することができます。
  2. copilot [svc/job] deploy を実行すると、カスタムアドオンのテンプレートがワークロードスタックと一緒にデプロイされます。
ワークロード Addon によるワークスペースのレイアウト例
.
└── copilot
    └── webhook
        ├── addons # Service "webhook" に関連する Addon の格納
        │   └── mytable-ddb.yaml
        └── manifest.yaml

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

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

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

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

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

Parameters セクションの書き方

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

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

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

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

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

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

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 スタックなどで使用できる任意の値を定義することができます。

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

ECS タスクまたは App Runner インスタンスから Addon Resources にアクセスする方法は、次のとおりです。

  • ECS タスクロールや App Runner インスタンスロールに追加のポリシーを追加する必要がある場合、追加のパーミッションを保持する IAM ManagedPolicy Addon リソースをテンプレートで定義し、それを出力することができます。このパーミッションは、タスクまたはインスタンスロールにインジェクトされます。
  • ECS サービスにセキュリティグループを追加する必要がある場合、テンプレートでSecurity Groupを定義し、それを出力として追加することができます。セキュリティグループは、自動的に ECS サービスにアタッチされます。
  • ECS タスクにシークレットを注入したい場合、テンプレートで Secret を定義し、出力として追加することができます。Secret はコンテナにインジェクトされ、大文字の SNAKE_CASE で環境変数としてアクセスすることができるようになります。
  • もし、任意のリソースの値を環境変数として注入したい場合は、ECS タスクに出力を作成することができます。これはコンテナにインジェクトされ、大文字の SNAKE_CASE で環境変数としてアクセスすることができるようになります。

DynamoDB テーブルのワークロード Addon テンプレート

ワークロードレベルの DynamoDB テーブル Addon のテンプレート例です。

# これらのパラメータのいずれかを使用して、テンプレートに条件やマッピングを作成することができます。
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:
  # AWS::DynamoDB::Table などのリソースをここで作成します。
  # MyTable:
  #   Type: AWS::DynamoDB::Table
  #   Properties:
  #     ...

  # 1. リソースに加えて、ECS タスクからリソースにアクセスする必要がある場合、リソースのパーミッション
  # を保持する AWS::IAM::ManagedPolicy を作成する必要があります。
  #
  # 以下は MyTable のポリシーの例です。
  MyTableAccessPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Sid: DDBActions
            Effect: Allow
            Action:
              - dynamodb:BatchGet*
              - dynamodb:DescribeStream
              - dynamodb:DescribeTable
              - dynamodb:Get*
              - dynamodb:Query
              - dynamodb:Scan
              - dynamodb:BatchWrite*
              - dynamodb:Create*
              - dynamodb:Delete*
              - dynamodb:Update*
              - dynamodb:PutItem
            Resource: !Sub ${ MyTable.Arn}

Outputs:
  # 1. IAM ManagedPolicy を出力して、Copilot が ECS タスクロールにマネージドポリシーとして追加できるようにする必要があります。
  MyTableAccessPolicyArn:
    Description: "The ARN of the ManagedPolicy to attach to the task role."
    Value: !Ref MyTableAccessPolicy

  # 2. もし、リソースのプロパティを環境変数として ECS タスクにインジェクトしたい場合は、その出力を定義する必要があります。
  #
  # 例として、出力された MyTableName は MY_TABLE_NAME という大文字のスネークケースでタスクにインジェクトされます。
  MyTableName:
    Description: "The name of this DynamoDB."
    Value: !Ref MyTable