Contentfulでexport / import（バックアップ／リストア［復元］）する

Contentfulで`export/import`する機会があったので、メモ。

# 前提条件

+ Contentfulのアカウントがあること（※ない場合は、「GitHubでログイン」で作りましょう）
+ node.jsがインストール済

# 手順

1. トークン作成
1. 設定ファイル作成
1. Contentfulへコマンドログイン
1. export
1. import

# 1. トークン作成 （Personal Access Tokens）

## Contentfulにブラウザログイン

GithubあたりでSSOして、ログインしてください。

![スクリーンショット 2021-01-16 15.18.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/6cd0a64d-993d-15b6-65d1-ffbc53f97d74.png)

## Settings - Api Keys

![スクリーンショット 2021-02-06 16.44.09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/32289a6f-2e0d-4587-a4c8-e89eae91b7de.jpeg)

## Content management tokens

![スクリーンショット 2021-02-06 16.45.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/b6bfe273-cf96-a64f-c796-8aeffe95eda0.jpeg)

## Generate personal token

![スクリーンショット 2021-02-06 16.47.04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/57737ea4-788c-fb86-d054-b61b024d3ee5.jpeg)

## 適当な名前を入れて作成します

ここでは、「api keys」と入れて作成しました。
![スクリーンショット 2021-01-16 15.22.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/2a4b4fbb-932e-a460-8eb6-cdd37f36ab18.jpeg)
この値をクリップボードに貼り付けてメモしておきます。

# 2.設定ファイル作成

## Contentfulの`Space ID`を取得

Settings - General settings で確認できます

![スクリーンショット 2021-01-16 15.28.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/c3bd5f6a-0d91-c20a-bca0-4b191240b045.jpeg)

![スクリーンショット 2021-01-16 15.30.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/50948c7d-91d3-548a-4b32-6d526b5efa8c.jpeg)

## 設定ファイル作成

```bash
$ cat <<EOF > example-config.json
{
  "spaceId": "<< 確認したスペースIDを記載 >>",
  "managementToken": "<< 1.で取得したトークンを記載 >>",
  "contentFile": "contentful-export.json"
}
EOF
```
ここまでで確認した、スペースIDとトークンを作成したファイルに記載します。

## 3. Contentfulへコマンドログイン

```bash
$ npx contentful-cli login --management-token "1.で取得したトークンを記載"


Great! Your CMA token is now stored on your system. (Located at /Users/hirosue/.contentfulrc.json)
You can always run contentful logout to remove it.
```

## 4.export

```bash
$ npx contentful-cli space export --config example-config.json

  ✔ Initialize client (1s)
  ✔ Fetching data from space
    ✔ Connecting to space (1s)
    ✔ Fetching content types data (1s)
    ✔ Fetching tags data (1s)
    ✔ Fetching editor interfaces data (1s)
    ✔ Fetching content entries data (1s)
    ✔ Fetching assets data (1s)
    ✔ Fetching locales data (1s)
    ✔ Fetching webhooks data (1s)
    ✔ Fetching roles data (1s)
  ↓ Download assets [skipped]
  ✔ Write export log file
    ✔ Lookup directory to store the logs
    ✔ Create log directory
    ✔ Writing data to file
┌───────────────────────┐
│ Exported entities     │
├───────────────────┬───┤
│ Content Types     │ 2 │
├───────────────────┼───┤
│ Tags              │ 0 │
├───────────────────┼───┤
│ Editor Interfaces │ 2 │
├───────────────────┼───┤
│ Entries           │ 4 │
├───────────────────┼───┤
│ Assets            │ 4 │
├───────────────────┼───┤
│ Locales           │ 1 │
├───────────────────┼───┤
│ Webhooks          │ 1 │
├───────────────────┼───┤
│ Roles             │ 1 │
└───────────────────┴───┘
The export took a few seconds (6s)

Stored space data to json file at: /path/to/workspace/tmp/contentful-export.json
No errors or warnings occurred
The export was successful.
✨ Done
```

## 5. import 

```bash
$  npx contentful-cli space import --config example-config.json

┌──────────────────────────────────────────────────┐
│ The following entities are going to be imported: │
├─────────────────────────────────┬────────────────┤
│ Content Types                   │ 2              │
├─────────────────────────────────┼────────────────┤
│ Tags                            │ 0              │
├─────────────────────────────────┼────────────────┤
│ Editor Interfaces               │ 2              │
├─────────────────────────────────┼────────────────┤
│ Entries                         │ 4              │
├─────────────────────────────────┼────────────────┤
│ Assets                          │ 4              │
├─────────────────────────────────┼────────────────┤
│ Locales                         │ 1              │
├─────────────────────────────────┼────────────────┤
│ Webhooks                        │ 1              │
└─────────────────────────────────┴────────────────┘
  ✔ Validating content-file
  ✔ Initialize client (1s)
  ✔ Checking if destination space already has any content and retrieving it (2s)
  ✔ Apply transformations to source data (1s)
  ✔ Push content to destination space
    ✔ Connecting to space (1s)
    ✔ Importing Locales (1s)
    ✔ Importing Content Types (4s)
    ✔ Publishing Content Types (2s)
    ↓ Importing Tags [skipped]
    ✔ Importing Editor Interfaces (2s)
    ✔ Importing Assets (26s)
    ✔ Publishing Assets (3s)
    ✔ Archiving Assets (1s)
    ✔ Importing Content Entries (4s)
    ✔ Publishing Content Entries (3s)
    ✔ Archiving Entries (0s)
    ✔ Creating Web Hooks (1s)
Finished importing all data
┌───────────────────────┐
│ Imported entities     │
├───────────────────┬───┤
│ Locales           │ 1 │
├───────────────────┼───┤
│ Content Types     │ 2 │
├───────────────────┼───┤
│ Editor Interfaces │ 2 │
├───────────────────┼───┤
│ Assets            │ 4 │
├───────────────────┼───┤
│ Published Assets  │ 4 │
├───────────────────┼───┤
│ Archived Assets   │ 0 │
├───────────────────┼───┤
│ Entries           │ 4 │
├───────────────────┼───┤
│ Published Entries │ 4 │
├───────────────────┼───┤
│ Archived Entries  │ 0 │
├───────────────────┼───┤
│ Webhooks          │ 1 │
└───────────────────┴───┘
The import took a few seconds (42s)


The following 0 errors and 1 warnings occurred:

15:50:99 - Rate limit error occurred. Waiting for 1561 ms before retrying...
The import was successful.
```

## 後処理(ログアウト)

```bash
$ npx contentful-cli logout

This will log you out by deleting the CMA token stored on your system.
? Do you want to log out now? Yes
Successfully logged you out.
```

## その他

無料アカウントだと`Rate limit`にたびたび引っかかります。

# 参考リンク

- [Personal Access Tokens](https://www.contentful.com/help/personal-access-tokens/)
- [Importing and exporting content with the Contentful CLI](https://www.contentful.com/developers/docs/tutorials/cli/import-and-export/)