Amplify init により作成されるファイルを理解して、Amplifyに詳しくなろうという考えで書いています。
親切なことに、作成されるファイルとその内容は公式ドキュメントに記載されていました。
基本的に以下のドキュメントを見ながら、実際の動作(amplify add xxなど)を通じてどのように変化するか見ていきます。
作成されるファイル
プロジェクトのルートに amplify ディレクトリが作成され、以下のファイル群が追加されます。
.
├── #current-cloud-backend
│ ├── amplify-meta.json
│ ├── awscloudformation
│ │ └── build
│ │ └── root-cloudformation-stack.json
│ └── tags.json
├── .config
│ ├── local-aws-info.json
│ ├── local-env-info.json
│ └── project-config.json
├── README.md
├── backend
│ ├── amplify-meta.json
│ ├── awscloudformation
│ │ └── build
│ │ └── root-cloudformation-stack.json
│ ├── backend-config.json
│ ├── tags.json
│ └── types
│ └── amplify-dependent-resources-ref.d.ts
├── cli.json
├── hooks
│ ├── README.md
│ ├── post-push.sh.sample
│ └── pre-push.js.sample
└── team-provider-info.json
また、その他に src/aws-exports.jsファイルと、.gitignoreファイルも作成されます。
この記事では.gitignoreファイルの説明は割愛します。
#current-cloud-backendディレクトリ
このディレクトリ配下のファイルは、現在、実際に作成されている AWS リソースの情報が保持されています。
backendディレクトリ
ローカル開発環境上の情報が保持されます。
amplify push でリソースが作成されていない場合でも、このディレクトリ配下のファイルは情報が反映されます。
.configディレクトリ
amplify init の時に指定した設定情報が反映されます。
hooksディレクトリ
amplify コマンドを実行する前後に実行するカスタムスクリプトを格納します。
このディレクトリについては前掲のドキュメントの中にありますが、先ほどとは異なるリンク先で説明されています。
amplify-meta.json
amplify-meta.jsonには、Amplifyで作成されたカテゴリと実際のリソースの情報が記載されます。以下のイメージです。
{
"<category>": {
"<service1>": {
//service1 metadata
},
"<service2>": {
//service2 metadata
}
}
}
amplify init 後の実際のファイルは以下です。
{
"providers": {
"awscloudformation": {
"AuthRoleName": "amplify-reactamplified-dev-xx-authRole",
"UnauthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-unauthRole",
"AuthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-authRole",
"Region": "ap-northeast-1",
"DeploymentBucketName": "amplify-reactamplified-dev-xx-deployment",
"UnauthRoleName": "amplify-reactamplified-dev-xx-unauthRole",
"StackName": "amplify-reactamplified-dev-xx",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xx:stack/amplify-reactamplified-dev-xx/631704a0-d2b1-11ec-9dea-0e0de774ae99",
"AmplifyAppId": "xx"
}
}
}
なお、同名のファイルが 、#current-cloud-backendとbackendディレクトリにそれぞれ格納されています。
#current-cloud-backendディレクトリの方は、実際に AWS リソースが作成されない限り反映されず、実際にクラウドに作成されたリソース情報が反映されます。
backendディレクトリの方は、実際に AWS リソースが作成されていなくても、ローカル開発環境の状態が反映されます。
気になったので、backend/amplify-meta.jsonを削除したらどうなるか確認してみます。
$ rm backend/amplify-meta.json
$ amplify add api
? Select from one of the below mentioned services: GraphQL
🛑 There was an error adding the API resource
🛑 File at path: '/Users/xxx/aws/amplify/react-amplified/amplify/backend/amplify-meta.json' does not exist
backend/amplify-meta.jsonがないと怒られ、GraphQL API カテゴリが追加できませんでした。
次に、backend/amplify-meta.jsonを復元した後、#current-cloud-backend/amplify-meta.jsonを削除してみます。
$ rm #current-cloud-backend/amplify-meta.json
$ amplify add api
? Select from one of the below mentioned services: GraphQL
? Here is the GraphQL API that we will create. Select a setting
to edit or continue Continue
? Choose a schema template: Single object with fields (e.g., “T
odo” with ID, name, description)
🛑 There was an error adding the API resource
🛑 File at path: '/Users/xxx/aws/amplify/react-amplified/amplify/#current-cloud-backend/amplify-meta.json' does not exist
何度か試しましたが、タイミングは違うものの#current-cloud-backend/amplify-meta.jsonファイルが存在しない場合もエラーが発生しました。
両ファイルともに削除厳禁のようです。
両ファイルの違いを更に実感したいので、実際にカテゴリを追加しその違いを確認します。
$ amplify add api
追加後のファイルがこちらです。
{
"providers": {
"awscloudformation": {
"AuthRoleName": "amplify-reactamplified-dev-xx-authRole",
"UnauthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-unauthRole",
"AuthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-authRole",
"Region": "ap-northeast-1",
"DeploymentBucketName": "amplify-reactamplified-dev-xx-deployment",
"UnauthRoleName": "amplify-reactamplified-dev-xx-unauthRole",
"StackName": "amplify-reactamplified-dev-xx",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xx:stack/amplify-reactamplified-dev-xx/631704a0-d2b1-11ec-9dea-0e0de774ae99",
"AmplifyAppId": "xx"
}
},
"api": {
"reactamplified": {
"service": "AppSync",
"providerPlugin": "awscloudformation",
"dependsOn": [],
"output": {
"authConfig": {
"defaultAuthentication": {
"authenticationType": "API_KEY",
"apiKeyConfig": {
"apiKeyExpirationDays": 7
}
},
"additionalAuthenticationProviders": []
}
}
}
}
}
{
"providers": {
"awscloudformation": {
"AuthRoleName": "amplify-reactamplified-dev-xx-authRole",
"UnauthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-unauthRole",
"AuthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-authRole",
"Region": "ap-northeast-1",
"DeploymentBucketName": "amplify-reactamplified-dev-xx-deployment",
"UnauthRoleName": "amplify-reactamplified-dev-xx-unauthRole",
"StackName": "amplify-reactamplified-dev-xx",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xx:stack/amplify-reactamplified-dev-xx/631704a0-d2b1-11ec-9dea-0e0de774ae99",
"AmplifyAppId": "xx"
}
}
}
backend/amplify-meta.jsonには追加された GraphQL API が反映されていますが、#current-cloud-backend/amplify-meta.jsonは反映されていません。
amplify push をしておらず、実際にはAWSリソースが作成されていないため、このような違いが発生しています。
ローカルだけでなく、実際にAWS上にリソースを作成してみます。
$ amplify push
{
"providers": {
"awscloudformation": {
"AuthRoleName": "amplify-reactamplified-dev-xx-authRole",
"UnauthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-unauthRole",
"AuthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-authRole",
"Region": "ap-northeast-1",
"DeploymentBucketName": "amplify-reactamplified-dev-xx-deployment",
"UnauthRoleName": "amplify-reactamplified-dev-xx-unauthRole",
"StackName": "amplify-reactamplified-dev-xx",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xx:stack/amplify-reactamplified-dev-xx/631704a0-d2b1-11ec-9dea-0e0de774ae99",
"AmplifyAppId": "xx"
}
},
"api": {
"reactamplified": {
"service": "AppSync",
"providerPlugin": "awscloudformation",
"dependsOn": [],
"output": {
"authConfig": {
"defaultAuthentication": {
"authenticationType": "API_KEY",
"apiKeyConfig": {
"apiKeyExpirationDays": 7
}
},
"additionalAuthenticationProviders": []
},
"GraphQLAPIIdOutput": "xx",
"GraphQLAPIEndpointOutput": "https://xx.appsync-api.ap-northeast-1.amazonaws.com/graphql",
"GraphQLAPIKeyOutput": "xx"
},
"providerMetadata": {
"s3TemplateURL": "https://s3.amazonaws.com/amplify-reactamplified-dev-xx-deployment/amplify-cfn-templates/api/cloudformation-template.json",
"logicalId": "apireactamplified"
},
"lastPushTimeStamp": "2022-05-13T13:12:07.522Z",
"lastPushDirHash": "xx"
}
}
}
{
"providers": {
"awscloudformation": {
"AuthRoleName": "amplify-reactamplified-dev-xx-authRole",
"UnauthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-unauthRole",
"AuthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-authRole",
"Region": "ap-northeast-1",
"DeploymentBucketName": "amplify-reactamplified-dev-xx-deployment",
"UnauthRoleName": "amplify-reactamplified-dev-xx-unauthRole",
"StackName": "amplify-reactamplified-dev-xx",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xx:stack/amplify-reactamplified-dev-xx/631704a0-d2b1-11ec-9dea-0e0de774ae99",
"AmplifyAppId": "xx"
}
},
"api": {
"reactamplified": {
"service": "AppSync",
"providerPlugin": "awscloudformation",
"dependsOn": [],
"output": {
"authConfig": {
"defaultAuthentication": {
"authenticationType": "API_KEY",
"apiKeyConfig": {
"apiKeyExpirationDays": 7
}
},
"additionalAuthenticationProviders": []
},
"GraphQLAPIIdOutput": "xx",
"GraphQLAPIEndpointOutput": "https://xx.appsync-api.ap-northeast-1.amazonaws.com/graphql",
"GraphQLAPIKeyOutput": "xx"
},
"providerMetadata": {
"s3TemplateURL": "https://s3.amazonaws.com/amplify-reactamplified-dev-xx-deployment/amplify-cfn-templates/api/cloudformation-template.json",
"logicalId": "apireactamplified"
},
"lastPushTimeStamp": "2022-05-13T13:12:07.522Z",
"lastPushDirHash": "xx"
}
}
}
実際に作成されたリソース関係の情報が両方のファイルに反映され、同一の内容を持つファイルになりました。
以上の結果により、
- backend/amplify-meta.json
- ローカルでのAmplifyの情報を保持(実際にAWSリソースが作成される前でもある程度反映される)
- current-cloud-backend/amplify-meta.json
- 現在、実際に作成されているAWSリソースの情報を保持
ということが改めて分かりました。
root-cloudformation-stack.json
Amplifyにより作成されるリソースはCloudFromationにより作成されます。
そのルートスタックのテンプレートがroot-cloudformation-stack.jsonです。
{
"Description": "Root Stack for AWS Amplify CLI",
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"DeploymentBucketName": {
"Type": "String",
"Default": "DeploymentBucket",
"Description": "Name of the common deployment bucket provided by the parent stack"
},
"AuthRoleName": {
"Type": "String",
"Default": "AuthRoleName",
"Description": "Name of the common deployment bucket provided by the parent stack"
},
"UnauthRoleName": {
"Type": "String",
"Default": "UnAuthRoleName",
"Description": "Name of the common deployment bucket provided by the parent stack"
}
},
"Outputs": {
"Region": {
"Description": "CloudFormation provider root stack Region",
"Value": {
"Ref": "AWS::Region"
},
"Export": {
"Name": {
"Fn::Sub": "${AWS::StackName}-Region"
}
}
},
"StackName": {
"Description": "CloudFormation provider root stack ID",
"Value": {
"Ref": "AWS::StackName"
},
"Export": {
"Name": {
"Fn::Sub": "${AWS::StackName}-StackName"
}
}
},
"StackId": {
"Description": "CloudFormation provider root stack name",
"Value": {
"Ref": "AWS::StackId"
},
"Export": {
"Name": {
"Fn::Sub": "${AWS::StackName}-StackId"
}
}
},
"AuthRoleArn": {
"Value": {
"Fn::GetAtt": [
"AuthRole",
"Arn"
]
}
},
"UnauthRoleArn": {
"Value": {
"Fn::GetAtt": [
"UnauthRole",
"Arn"
]
}
},
"DeploymentBucketName": {
"Description": "CloudFormation provider root stack deployment bucket name",
"Value": {
"Ref": "DeploymentBucketName"
},
"Export": {
"Name": {
"Fn::Sub": "${AWS::StackName}-DeploymentBucketName"
}
}
},
"AuthRoleName": {
"Value": {
"Ref": "AuthRole"
}
},
"UnauthRoleName": {
"Value": {
"Ref": "UnauthRole"
}
}
},
"Resources": {
"DeploymentBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": {
"Ref": "DeploymentBucketName"
},
"BucketEncryption": {
"ServerSideEncryptionConfiguration": [
{
"ServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}
]
}
},
"UpdateReplacePolicy": "Retain",
"DeletionPolicy": "Retain"
},
"AuthRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Deny",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity"
}
]
},
"RoleName": {
"Ref": "AuthRoleName"
}
}
},
"UnauthRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Deny",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity"
}
]
},
"RoleName": {
"Ref": "UnauthRoleName"
}
}
}
}
}
試しにストレージカテゴリを追加すると、root-cloudformation-stack.jsonにストレージリソースを追加するスタックが追加されました。
$ amplify add storage
$ amplify push
以下ではroot-cloudformation-stack.jsonのうち、追加されたストレージリソースの部分を掲載します。
"storagedynamof54ffe42": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"TemplateURL": "https://s3.amazonaws.com/amplify-reactamplified-dev-xxx-deployment/amplify-cfn-templates/storage/dynamof54ffe42-cloudformation-template.json",
"Parameters": {
"tableName": "dynamof54ffe42",
"partitionKeyName": "name",
"partitionKeyType": "S",
"env": "dev"
}
}
}
実際にストレージリソースを作成するスタックのテンプレートは、#current-cloud-backendディレクトリの配下だと、
- #current-cloud-backend/storage/dynamof54ffe42/buildディレクトリ
- #current-cloud-backend/awscloudformation/build/storage/dynamof54ffe42/buildディレクトリ
の2つに格納されています。
以下では#current-cloud-backendディレクトリ以下を掲載しますが、backendディレクトリ以下も同様の配置です。
#current-cloud-backend
├── awscloudformation
│ └── build
│ ├── awscloudformation
│ │ └── build
│ │ └── root-cloudformation-stack.json
│ ├── root-cloudformation-stack.json
│ └── storage
│ └── dynamof54ffe42
│ └── build
│ └── dynamof54ffe42-cloudformation-template.json
└── storage
└── dynamof54ffe42
├── build
│ ├── dynamof54ffe42-cloudformation-template.json
│ └── parameters.json
└── cli-inputs.json
同名のファイルがチラホラありますが、同じ内容のファイルでした。
#current-cloud-backend/storageディレクトリ以下に、パラメーターの値を決定するparameters.jsonがあるので、内部的にはこちらのディレクトリ配下のファイルを使用してリソースが作成されているのでしょうか。
なお、amplify remove storageコマンドを実行すると、backend/storageディレクトリ以下のファイルがなくなりました。
ただし、backend/cloudformation/build/storage以下の内容は残っています。
特定ファイルが作成・削除される詳細条件は分かりませんが、amplify cli コマンドの内容により、amplify ディレクトリ以下のファイルは都度変動すると理解しておけば良いでしょう。
tags.json
Amplifyで生成されたAWSリソースにタグを付けるために使用されるファイルです。
backend/tags.jsonの方を編集してタグにしたいキー・バリューを指定します。
[
{
"Key": "user:Stack",
"Value": "{project-env}"
},
{
"Key": "user:Application",
"Value": "{project-name}"
}
]
backend-config.json
バックエンドに関する設定が記載されます。
例えば、AWSリソースへの接続方法やリソースのプロパティなどが含まれます。
Amplify CLI の機能を超えてバックエンドを設定したい場合は、このファイルを手動で編集できます。
ファイルは最初は以下の状態です。
{}
amplify add xxx などで、以下のように増えていきます。
{
"api": {},
"storage": {
"s3c38ed90d": {
"service": "S3",
"providerPlugin": "awscloudformation",
"dependsOn": []
}
},
"auth": {
"reactamplifiedf7d118bd": {
"service": "Cognito",
"providerPlugin": "awscloudformation",
"dependsOn": [],
"customAuth": false,
"frontendAuthConfig": {
"socialProviders": [],
"usernameAttributes": [],
"signupAttributes": [
"EMAIL"
],
"passwordProtectionSettings": {
"passwordPolicyMinLength": 8,
"passwordPolicyCharacters": []
},
"mfaConfiguration": "OFF",
"mfaTypes": [
"SMS"
],
"verificationMechanisms": [
"EMAIL"
]
}
}
}
}
local-aws-info.json
その名の通り、ローカルの AWS の profile 名などを使用するかなどの情報が保存されます。
amplify init 実行時に聞かれる内容ですね。
{
"dev": {
"configLevel": "project",
"useProfile": true,
"profileName": "default"
}
}
local-env-info.json
プロジェクトのパスや使用するエディターなど、環境の情報が記載されます。
{
"projectPath": "/xxx/xxx/aws/amplify/react-amplified",
"defaultEditor": "vscode",
"envName": "dev"
}
project-config.json
その名の通り、プロジェクトの設定が記載されています。
{
"projectName": "react-amplified",
"version": "3.1",
"frontend": "javascript",
"javascript": {
"framework": "react",
"config": {
"SourceDir": "src",
"DistributionDir": "build",
"BuildCommand": "npm run-script build",
"StartCommand": "npm run-script start"
}
},
"providers": [
"awscloudformation"
]
}
cli.json
プロジェクトの機能フラグ設定が含まれます。
例えば認証に関する機能フラグだと、Cognitoのメールとユーザー名の小文字・大文字を区別するか否かといった機能を、どちらにするか設定することができます。
{
"features": {
"graphqltransformer": {
"addmissingownerfields": true,
"improvepluralization": false,
"validatetypenamereservedwords": true,
"useexperimentalpipelinedtransformer": true,
"enableiterativegsiupdates": true,
"secondarykeyasgsi": true,
"skipoverridemutationinputtypes": true,
"transformerversion": 2,
"suppressschemamigrationprompt": true,
"securityenhancementnotification": false,
"showfieldauthnotification": false,
"usesubusernamefordefaultidentityclaim": true
},
"frontend-ios": {
"enablexcodeintegration": true
},
"auth": {
"enablecaseinsensitivity": true,
"useinclusiveterminology": true,
"breakcirculardependency": true,
"forcealiasattributes": false,
"useenabledmfas": true
},
"codegen": {
"useappsyncmodelgenplugin": true,
"usedocsgeneratorplugin": true,
"usetypesgeneratorplugin": true,
"cleangeneratedmodelsdirectory": true,
"retaincasestyle": true,
"addtimestampfields": true,
"handlelistnullabilitytransparently": true,
"emitauthprovider": true,
"generateindexrules": true,
"enabledartnullsafety": true
},
"appsync": {
"generategraphqlpermissions": true
},
"latestregionsupport": {
"pinpoint": 1,
"translate": 1,
"transcribe": 1,
"rekognition": 1,
"textract": 1,
"comprehend": 1
},
"project": {
"overrides": true
}
}
}
pre-push.sh.sample
amplify cli 実行前に実行されるカスタムスクリプトを設定できます。
実際に設定するときは、ファイル名を以下に変更します。
jsは、デフォルトではNode.jsが利用されます。
pre-<Command>[-<Sub-Command>].js
なお、拡張子の部分はデフォルトで.shも可能ですが、hooks/hooks-config.jsonを設定することで他のランタイムにすることもできます。
amplify status 実行前に実行するスクリプトをNode.jsで作成する際は、以下のファイル名になります。
pre-status.js
実際に作成したファイルが以下です。
const fs = require('fs');
// 「0」は標準入力を指す。Amplify CLIから標準入力を介してパラメータを受け取れる
// なお、受け取るパラメータは現在の設定などから決まり、おそらく利用者側では制御できない
const parameters = JSON.parse(fs.readFileSync(0, { encoding: 'utf8' }));
console.log("コマンド実行前に実行")
console.log(JSON.stringify(parameters, null, 4));
amplify statusを実行してみます。
$ amplify status
----- 🪝 pre-status execution start -----
コマンド実行前に実行
{
"data": {
"amplify": {
"environment": {
"projectPath": "/xx/xx/aws/amplify/react-amplified",
"defaultEditor": "vscode",
"envName": "dev"
},
"command": "status",
"argv": [
"/xx/xx/.amplify/bin/amplify",
"/snapshot/repo/build/node_modules/@aws-amplify/cli-internal/bin/amplify",
"status"
],
"version": "8.2.0"
}
}
}
----- 🪝 pre-status execution end -----
Current Environment: dev
┌──────────┬───────────────┬───────────┬─────────────────┐
│ Category │ Resource name │ Operation │ Provider plugin │
└──────────┴───────────────┴───────────┴─────────────────┘
コマンドが実行される前に、スクリプトが実行されることを確認できました。
標準入力を受け取る様子がいまいち想像できないという方は、以下のコマンド実行を見ればイメージできるかもしれません。
Amplify CLIが以下のような方法でパラメーターを渡してくれるイメージです。
$ echo '{"key":"value"}' | node pre-status.js
コマンド実行前に実行
{
"key": "value"
}
post-push.js.sample
pre-push.sh.sampleと一緒です。
スクリプトが実行されるタイミングがコマンド実行後であることと、ファイルの命名規則が、preではなくpostであることだけが違います。
team-provider-info.json
チーム内で、プロジェクトの状況を共有するために利用されます。
チームメンバーが同じCloudFormationスタックにリソースをプッシュ・プロビジョニングできます。
{
"dev": {
"awscloudformation": {
"AuthRoleName": "amplify-reactamplified-dev-xxx-authRole",
"UnauthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-unauthRole",
"AuthRoleArn": "arn:aws:iam::xxx:role/amplify-reactamplified-dev-xx-authRole",
"Region": "ap-northeast-1",
"DeploymentBucketName": "amplify-reactamplified-dev-xx-deployment",
"UnauthRoleName": "amplify-reactamplified-dev-xx-unauthRole",
"StackName": "amplify-reactamplified-dev-xx",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xxx:stack/amplify-reactamplified-dev-xx/631704a0-d2b1-11ec-9dea-0e0de774ae99",
"AmplifyAppId": "xx"
}
}
}
aws-export.js
amplify init により作成されるのは、今までご紹介したamplifyディレクトリ以下のファイル群のみではありません。
それが今回ご紹介するaws-exports.jsです。
このファイルは、srcディレクトリ以下に作成されます。
Amplifyで作成したサービスに関するすべての設定が保存され、Amplifyクライアントが、このファイルによりバックエンドのサービスに関する必要な情報を取得します。
一般的に、以下のようにしてAmplifyクライアントがリソース情報を取得します。
import Amplify from 'aws-amplify';
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);
なお、このファイルはJavascriptの場合作成されるファイルです。
AndroidやiOSの場合はamplifyconfiguration.jsonファイルが作成され、同様の役割を持ちます。
さいごに
実際にファイルを見て手を動かすことで、 amplify init によりどのようなファイルが作成されるか理解できました。
どなたかのお役に立てれば幸いです。