AWS DataSyncのinclude/excludeパターンを混ぜるとどうなる?

2022.03.16

AWS DataSyncは、オンプレミスと AWS ストレージサービス間のデータ移動を自動化して加速化する安全なオンラインサービスです。

ソース全体、あるいは、include/excludeパターンで対象ソースをフィルタリングしてデータ転送できます。

Amazon EFSをソースにして、include/exclude ルールが入れ子になっている場合を評価する機会があったので、結果を共有します。

結論

DataSyncのinclude/excludeフィルタリングでは、includeルールでフィルタリングしたオブジェクトのうち、excludeルールにマッチしないオブジェクトが転送されます。 また、include ルールでソース全体(/*) を指定できません。

直感通りといえば直感通りです。

include/excludeを併用すると、やってしまいがちな設定例を紹介します。

include/exlcude を組み合わせてみる

転送したくないディレクトリのサブディレクトリに転送したいディレクトリが含まれているとします。

$ tree
.
├── 転送したくない
│   ├── 転送したい
│   │   └── test.txt
│   └── test.txt
└── test.txt

正しいフィルタリング

シンプルに

  • include
    • /転送したくない/転送したい/*

と指定すると、/転送したくない/転送したい/ 以下が転送されます。

誤ったフィルタリング:include が exclude でかき消される

  • include
    • /転送したくない/転送したい/*
  • exclude
    • /転送したくない/*

と指定すると、 include 対象のパスが exclude にマッチするため、何も転送されません。

誤ったフィルタリング:include ですべてを指定できない

データソースの一部だけを転送から除外したい場合

  • include
    • /*
  • exclude
    • /転送したくない/*

と指定したくなります。

残念ながら、ソース全体が対象となるような include パターンを指定すると、エラーになるため、実現できません。

誤ったフィルタリング:入れ子の include ルールが exclude でかき消される

foo
├── bar
│   ├── baz
│   │   └── test.txt
│   └── test.txt
└── test.txt

という階層に対して

  • include
    • /foo/*
    • /foo/bar/baz*
  • exclude
    • /foo/bar/*

と指定すると、入れ子の /foo/bar/baz* includeパターンは /foo/bar/* の exclude パターンにかき消されるため、/foo/bar/baz/test.xt は転送されず、 /foo/test.txt だけが転送されます。

まとめ

AWS DataSyncのinclude/excludeフィルタリングを使うと、転送対象のデータソースを制限できます。

exclude パターンは include 対象の一部を除外するものであり

  • データソース全体の一部を除外
  • excludeで除外したパスの一部を include する

といったことは実現できない点に、ご注意ください。

それでは。

参考