💡

Amplify CLIを使って、作成済みのDynamoDBテーブルをアプリにimportする

2021/09/10に公開

GraphQL (AppSync)やREST APIですでに作成済みのDynamoDBテーブルにアクセスしたい場合、Amplify CLIでデータをインポートする必要があります。

Storageとしてimportする必要がある

これ結構な罠な気がしますが、DynamoDBのテーブルはStorageとしてimportします。

amplify import storageを実行すると、S3バケットかDynamoDBかを質問されるので、ここでDynamoDBを選びましょう。

% amplify import storage
? Please select from one of the below mentioned services: 
  S3 bucket - Content (Images, audio, video, etc.) 
❯ DynamoDB table - NoSQL Database 

Import対象は自動で表示してくれる

Amplify Projectのあるリージョンと同じである必要がありそうですが、Importするテーブルの候補はCLI側が出してくれます。

? Select the DynamoDB Table you want to import: … 
Archive
Archive-development
Artifact
Artifact-development

複数選択はできないので、複数テーブルをimportしたい場合は何回か実行しましょう。
また、amplify envでdev / prodなどの複数環境を運用している場合も、amplify env checkout [env]した後にその環境で使うDynamoDBテーブルをimportする必要があります。

Import後のamplify status

amplify import storageした後の状態がこのような形でした。
ApiはAppSyncを使ったGraphQL API1つです。

% amplify status

Current Environment: dev

| Category | Resource name        | Operation | Provider plugin   |
| -------- | -------------------- | --------- | ----------------- |
| Api      | amplifytask1         | Update    | awscloudformation |
| Auth     | amplifytask134bf6c11 | No Change | awscloudformation |
| Storage  | Sitedevelopment      | Import    | awscloudformation |

ApiにもUpdateがついているのは、内部でimportしたDynamoDBを使えるようにするUpdateをするためと思われます。

[Appendix] amplify/の差分

+  },
+  "storage": {
+    "Sitedevelopment": {
+      "service": "DynamoDB",
+      "serviceType": "imported",
+      "providerPlugin": "awscloudformation",
+      "dependsOn": []
+    }
   }
 }
\ No newline at end of file
diff --git a/amplify/team-provider-info.json b/amplify/team-provider-info.json
index 241cdde..a249967 100644
--- a/amplify/team-provider-info.json
+++ b/amplify/team-provider-info.json
@@ -19,6 +19,16 @@
           "webClientId": "xxxxxx",
           "nativeClientId": "xxxxxx"
         }
+      },
+      "storage": {
+        "Sitedevelopment": {
+          "tableName": "Site-development",
+          "region": "us-east-1",
+          "arn": "arn:aws:dynamodb:us-east-1:99999:table/Site-development",
+          "streamArn": "arn:aws:dynamodb:us-east-1:999999:table/Site-development/stream/2017-05-31T03:34:39.024",
+          "partitionKeyName": "ID",
+          "partitionKeyType": "S"
+        }
       }
     }
   }

Discussion