😁

【AWS Amplify Gen2】sandboxで生成される、amplifyconfigure.jsonについて-PMLinc

2024/02/21に公開

What is amplifyconfigure.json??

amplify Gen2では、npx amplify sandboxとすると、amplifyの個人用検証環境用のbackendが作成されます。※個人用検証環境は、Ctl+Cとすると、個人開発環境を削除してリソースを削除されます。

Gen2の初回キャッチアップはこちら
https://zenn.dev/purpom/articles/12538dec010be8

npx amplify sandboxとしたときに、amplify backendがdeployされて、amplifyconfigure.jsonが生成されるようになります。

amplifyconfigure.jsonは、backendとfrontendのconfigのやりとりをしてくれる大事なファイルになります。
ちなみに従来のamplifyの書き方でいう、amplify/backend/backend-config.jsonです。

実際に、npx amplfiy sandboxがsuccessになった時のログ

今回は、amplifyconfigure.jsonについて色々調べてわかったことをまとめていきたいと思います。

Hello! Purpom Media Lab

Purpom Media Lab incでは、AWS Amplifyや、LambdaなどのServerless Stackを中心とした高速MVP構築及びサービス価値の検証を行っています。
https://purpom-media-lab.com/

また、MVPを構築するだけではなく、AWS Amplifyを中心としたオープンソースの機能改善なども行っています。

https://github.com/aws-amplify/amplify-backend/pull/857

https://zenn.dev/kaiki_kk/articles/24c5b95df8daa8

🎉 Tips 🎉

npx amplify sandboxで個人環境をdeployした際に、なんらかの原因で、Failedになってしまったときに原因特定するときにdebugコマンドを使うと何のリソースで落ちたのかを調べやすくなるので、便利

amplifyconfigure.jsonのtypeが知りたい。

amplify/backend.tsにある、defineBackendが鍵になります。defineBackendにamplifyのGen2ライフサイクルでDeployされるリソースが定義されてます。
(ex. auth/data/など)

/amplify/backend.ts

import { defineBackend } from '@aws-amplify/backend';
import { auth } from './auth/resource';
import { data } from './data/resource';

//NOTE: これがamplify Gen2のライフサイクルで動くバックエンドリソースを束ねる親玉
const backend = defineBackend({
  auth,
  data,
});

話が脱線するのですが、そもそものGen2のソースコードでは、monorepo管理されていて、
packages/配下に、コアのコードが書かれています。

https://github.com/magisystem0408/amplify-backend/tree/main/packages

このコアコードがどうやって連携して動いてるのか社内でまとめていて(今のところ)

packages/backendが全ての起点になって、package/backend-xxxxが動いてるそうです。

https://github.com/magisystem0408/amplify-backend/tree/main/packages/backend

ネコで表すとこんな感じ。そのうちgen2自体がどうゆうふうに動いてるのかをまとめます。

amplifyconfigure.jsonで生成される型は、下記になることがわかりました。

export type ClientConfig = Partial<AnalyticsClientConfig & AuthClientConfig & GeoClientConfig & GraphqlClientConfig & NotificationsClientConfig & StorageClientConfig & PlatformClientConfig & CustomClientConfig>;

https://github.com/magisystem0408/amplify-backend/blob/40298a493099f8f085d79fdcb705dc24b15a2198/packages/client-config/src/client-config-types/client_config.ts#L9-L14

実際に以下のTypeがPartialされて、amplifyconfigure.jsonが生成されるようになります。

export type AnalyticsClientConfig = {
    Analytics?: {
        AWSPinpoint: {
            appId: string;
            region: string;
        };
    };
};
export type AuthClientConfig = {
    aws_cognito_region: string;
    aws_user_pools_id?: string;
    aws_user_pools_web_client_id?: string;
    aws_cognito_identity_pool_id?: string;
    aws_mandatory_sign_in?: string;
    aws_cognito_username_attributes?: string[];
    aws_cognito_signup_attributes?: string[];
    aws_cognito_mfa_configuration?: string;
    aws_cognito_mfa_types?: string[];
    aws_cognito_password_protection_settings?: {
        passwordPolicyMinLength?: number;
        passwordPolicyCharacters?: string[];
    };
    aws_cognito_verification_mechanisms?: string[];
    aws_cognito_social_providers?: string[];
    allowUnauthenticatedIdentities?: string;
    oauth?: {
        domain?: string;
        scope?: string[];
        redirectSignIn?: string;
        redirectSignOut?: string;
        clientId?: string;
        responseType?: string;
    };
};
export type GeoClientConfig = {
    geo?: {
        amazon_location_service: {
            region: string;
            maps?: {
                items: Record<string, {
                    style: string;
                }>;
                default: string;
            };
            search_indices?: {
                items: Array<string>;
                default: string;
            };
            geofenceCollections?: {
                items: Array<string>;
                default: string;
            };
        };
    };
};
export type GraphqlClientConfig = {
    aws_appsync_region: string;
    aws_appsync_graphqlEndpoint: string;
    aws_appsync_authenticationType: string;
    aws_appsync_additionalAuthenticationTypes?: string;
    aws_appsync_conflictResolutionMode?: string;
    aws_appsync_apiKey?: string;
    modelIntrospection?: unknown;
};
export type NotificationsClientConfig = {
    Notifications?: {
        SMS?: {
            AWSPinpoint: {
                appId: string;
                region: string;
            };
        };
        EMAIL?: {
            AWSPinpoint: {
                appId: string;
                region: string;
            };
        };
        APNS?: {
            AWSPinpoint: {
                appId: string;
                region: string;
            };
        };
        FCM?: {
            AWSPinpoint: {
                appId: string;
                region: string;
            };
        };
        InAppMessaging?: {
            AWSPinpoint: {
                appId: string;
                region: string;
            };
        };
    };
};
export type StorageClientConfig = {
    aws_user_files_s3_bucket_region: string;
    aws_user_files_s3_bucket: string;
};
export type PlatformClientConfig = {
    aws_project_region: string;
};
export type CustomClientConfig = {
    custom: Record<string, string>;
};

【課題】amplifyconfigure.jsonに、自身で定義したkey:valueを定義したいがどうやってやる??

実際にGen2は今2024-02現在でPreviewなので、後々改善Gen2自体がされていくと思うのですが、
カスタムCDKでDeployしたリソース(ex. lambda関数のendpointなど)は、amplifyconfigure.jsonで生成されないので追加したいということが発生しました。

調べた結果上記で説明した、typeの下記を利用します。

export type CustomClientConfig = {
    custom: Record<string, string>;
};

backend.addOutputでcustomに追加できることが可能です。

amplify/backend.ts
import { defineBackend } from '@aws-amplify/backend';

import { auth } from './auth/resource';
import { data } from './data/resource';

const backend = defineBackend({
  auth,
  data,
});

//NOTE: addOutputで追加できる
backend.addOutput({
  custom: {
    "mamushi": "neko"
  }
})

ちなみにamplifyconfigure.jsonは、
amplify-backend/packages/client-config/src/paths/get_client_config_path.tsあたりで生成される。

https://github.com/magisystem0408/amplify-backend/blob/40298a493099f8f085d79fdcb705dc24b15a2198/packages/client-config/src/paths/get_client_config_path.ts#L5

PURPM MEDIA LAB Tech blog

Discussion