はじめに

AWS Amplifyを使ってみて個人的にハマったことのメモです.

やったこと

  • コンテナ(Fargate)に対して,環境に応じた環境変数を設定する
  • ロールに対して任意のポリシーを追加する
  • コンテナが配置されたVPCにリソースを配置する

コンテナ(Fargate)に対して,環境に応じた環境変数を設定する

AWS AmplifyではAPIを実装するリソースとしてコンテナ(Fargate)がサポートされています.ですが,現状ではデプロイ環境(devprodなど)に応じた環境変数を設定することができないようです.(少なくとも,私には見つけることができませんでした)

最初は,CloudFormationの定義ファイルを手動で書き換えることで実現できると考えていました.ですが,実際に作業を進めるとこのファイルはamplify pushのたびにdocker-compose.yamlから生成されることが判明しました.そこで,

  • dev環境向けにdocker-compose.yaml.devを,prod環境向けにdocker-compose.yaml.prodをそれぞれ作成
  • コマンドフックを利用して,amplify pushのタイミングでdocker-compose.yaml.devまたはdocker-compose.yaml.proddocker-compose.yamlにコピー

という対応を採用しました.

ロールに対して任意のポリシーを追加する

カスタムリソースを追加した場合など,Lambdaに任意のポリシーを追加したい場合があると思います.そのような場合は,custom-policies.jsonを利用するのが楽です. 一応,ここここなど,AWSの公式ドキュメントにも記載されているようですが,目立つところには記載されていないため気がつくまでに時間がかかりました.

コンテナが配置されたVPCにリソースを配置する

コンテナの配置されるVPCは, amplify/backend/backend-config.json中に記述されているNetworkStackというリソースによって作成されれます.NetworkStack

  • CloudMapNamespaceId
  • ClusterName
  • Igw
  • SubnetIds
  • VpcCidrBlock
  • VpcId
  • VpcLinkId

を出力します.必要なパラメータはリソースによって異なると思いますが,SubnetIdsVpcIdなどを参照することでコンテナと同じVPC内にリソースを配置することができると思います.

上記パラメータを参照するためには,

  1. amplify/backend/backend-config.jsonにおいて,上記パラメータを参照するリソースのdependsOnNetworkStackを追加
    ...
    
      "dependsOn": [
        {
          "category": "",
          "resourceName": "NetworkStack",
          "attributes": [
            "VpcId",
            "SubnetIds"
          ]
        }
      ]
    
    ...
    
  2. 上述のリソースのCloudFormationの設定ファイルにパラメータの設定を追加.この際,パラメータ名はNetworkStack<Attribute名>となります
    ...
    
    "Parameters": {
      ...
    
      "NetworkStackVpcId": {
        "Type": "String"
      },
      "NetworkStackSubnetIds": {
        "Type": "CommaDelimitedList"
      },
    
      ...
    }, 
    ...
    
  3. amplify env checkout <env>を実行して環境のチェックアウトを行う

参考