EGAのDeposit dataをダウンロード
The European Genome-phenome Archive (EGA)ではRaw FASTQファイルなどがコントロールアクセスでdepositされている。
ユーザーは使いたいDatasetがあると、コメント付きでリクエストを送る。
リクエストページの一例
リクエストしても全然連絡が無いので諦めていたが、1か月以上空いてやっとアクセス可の連絡が来た。depositしたグループの対応が早いか遅いかでかなり変わる。
アクセス許可の通知メール
データのダウンロードには2通りの方法が用意されている。どちらの手法でもPythonを扱える環境が必要になる。
- 方法1)FileZillaを用いてSFTP接続。マウス操作でダウンロードできるが、暗号化ファイルの復元にはPythonのコマンド操作が必要。
https://ega-archive.org/access/download/files/live-outbox/ - 方法2)PyEGA3ツールを使ってコマンド操作でダウンロード。
https://ega-archive.org/access/download/files/pyega3/
方法2のPyEGA3は復元処理などが必要無いが、巨大ファイルのダウンロードがうまくいかなかったりする。方法1の方がダウンロードはうまくいきやすい印象。
方法1『 SFTP接続で暗号化ファイルをダウンロード 』
暗号化されたファイルをダウンロードして、その後復元する方法。ダウンロードされたファイルは「.c4gh」という拡張子になっている。ファイルのダウンロードはFileZillaソフトやsftp
コマンドでEGA serverに接続して行う。
EGAの紹介ページに沿って挑戦する。
秘密鍵・公開鍵の作成と登録
EGAアカウントは既に作っているとして、3番目のCrypt4GH-compatible public keyとやらをEGA accountに登録するところから行う。
EGA公式サイト(Live Distribution)より抜粋
EGAサイトにログインして、 My profile ➔ Edit ➔ Public key と進む。同ページに「How do I create a key?」というリンクがある。
ssh-keygen
コマンドを使った秘密鍵・公開鍵の作成と、登録方法が書いてある。
ssh-keygen
コマンドはWindowsではコマンドプロンプト、Powershell、WSLなどで使用できる。本記事ではWindows Powershellを使用した。
ssh-keygen -t ed25519
ファイル名を聞かれるが何も打たずにEnter(C:/Users/admin/.ssh/id_ed25519にファイルが保存)
passphraseを聞かれるので、任意のパスワードを設定する。※ このパスワードは後々良く使う。
出力先のフォルダには2つのファイルが出力されている。.pubファイルの中身をPublic keyとして登録する。.pubと付いていない方は後述のFileZillaで使用する。
公開鍵の内容をPublic keyページに登録していく。中身を表示するためにcat
コマンドを使用している。
cat C:\Users\admin\.ssh\id_ed25519.pub
これをアカウントのPublic keyページにコピペしてUpdata。
方法1-1【 FileZilla 】
SFTP接続でファイルをダウンロードするのに、EGAサイトでもFileZillaが紹介されているので、こちらを使用する。
EGA公式サイト(Live Distribution)より抜粋
インストール
以下のリンクから無料版のインストーラーをダウンロードし、PCにインストールした。
FileZillaのメインウィンドウ
EGAサイトとの接続を登録
ファイル
➔ サイトマネージャー
新しいサイト
をクリック。ウィンドウ右側をEGAの紹介ページ通りに埋めていく。
接続
を押してEGA serverとの接続を試みる。
(私の場合はその日は何回やっても接続できなかったが、数日後に接続すると、)接続先を信頼するか聞かれ、その後パスワード(ssh-keygenのpassphrase)を打つと接続される。
パスワード画面
接続に成功すると、FileZillaの右側パネルにEGA側のアクセス可能なdatasetが確認できるようになる。
接続後画面
ファイル転送
FileZilla画面の右側のリモート先のファイルを左側のローカルサイトの好きな場所へドラッグしていく。
方法1-2【 sftpコマンドで接続 】
FileZillaソフトを使わずにsftp
コマンドを使った方法もEGAサイトで紹介されている。
EGA公式サイト(Live Distribution)より抜粋
Linux/Unixと書いてあるが、WindowsではWSLやPowershellなどで実行可能。ユーザー名に「@outbox.ega-archive.org」を付ける。
sftp ユーザー名@outbox.ega-archive.org
途中yesと打ったりpassphraseを打ったりがあってプロンプトがsftp>
に変われば成功。(何度かやり直したりがあるかも。)
接続成功画面
アクセス可能なファイル確認。
ls -la
datasetごとにフォルダがある。
cd <dataset ID>
ls
get
コマンドでダウンロードするファイル名を指定する。ダウンロード先を指定する場合は第二引数に出力先ディレクトリパスを指定する。
get <fileID> <出力パス>
dataset内の複数ファイルをダウンロードするには、fileIDを半角スペース区切りで指定することや、ワイルドカードを使うことで実行できる。
get <fileID1 fileID2 fileID3> <出力パス>
get <*.c4gh> <出力パス>
【 Crypt4GHを用いてファイル復元 】
上記まででダウンロードした暗号化ファイルを復元していく。Crypt4GHというツールが必要。
EGA公式サイト(Live Distribution)より抜粋
インストール
Pythonツールなので事前にPythonが使える環境が必要となる。私の場合はWindows版Anacondaをインストール済みでコマンドプロンプトからpip
コマンドが使用可能であるのでこちらを使用する。
pip install crypt4gh
インストール画面
復元
crypt4gh decrypt
コマンドを使用する。--sk
フラグを立てて、秘密鍵のファイルパスを指定する。その次に、暗号化ファイルのパスを< 暗号化ファイルパス
という風に入力し、出力をリダイレクト>
でファイルに書き込む。出力ファイル名では任意のファイル名を付けてよい。
出力にディレクトリパスを含めるとうまくいかなかったので、ファイル名だけを指定してカレントディレクトリに書き出させている。(cd
で事前に出力先フォルダに移動しておけばよい。)
crypt4gh decrypt --sk C:\Users\admin\.ssh\id_ed25519 < 「.c4ghファイルのパス」 > 「出力ファイル名」
この処理は17GBのファイルでも2,3分で終了した。
複数ファイルのdecrypt
参考
https://docs.csc.fi/data/sensitive-data/tutorials/decrypt-directory/
crypt4gh decrypt
は複数ファイルの入力に対応していない。
datasetのファイルが沢山ある場合、crypt4gh decrypt
を何回もやるのは面倒である。
EGAサーバーからダウンロードした暗号化ファイルたち
ここでは繰り返し処理による復元処理を紹介する。※ ファイル名のキャプチャーにsed
コマンドを使う関係でWSLにcrypt4gh
をインストールして、WSL内で処理を行った。
パスワードを環境変数に登録
crypt4gh decrypt
を実行するとPassphraseの入力が求められるが、複数ファイルに繰り返し処理すると、処理の度にPassphraseが求められるため、自動で進まない。
crypt4gh
コマンドのhelpを見ると、環境変数にC4GH_PASSPHRASE
がある。
crypt4gh --help
crypt4gh --help
Utility for the cryptographic GA4GH standard, reading from stdin and outputting to stdout.
Usage:
crypt4gh [-hv] [--log <file>] encrypt [--sk <path>] --recipient_pk <path> [--recipient_pk <path>]... [--range <start-end>] [--header <path>]
crypt4gh [-hv] [--log <file>] decrypt [--sk <path>] [--sender_pk <path>] [--range <start-end>]
crypt4gh [-hv] [--log <file>] rearrange [--sk <path>] --range <start-end>
crypt4gh [-hv] [--log <file>] reencrypt [--sk <path>] --recipient_pk <path> [--recipient_pk <path>]... [--trim] [--header-only]
Options:
-h, --help Prints this help and exit
-v, --version Prints the version and exits
--log <file> Path to the logger file (in YML format)
--sk <keyfile> Curve25519-based Private key
When encrypting, if neither the private key nor C4GH_SECRET_KEY are specified, we generate a new key
--recipient_pk <path> Recipient's Curve25519-based Public key
--sender_pk <path> Peer's Curve25519-based Public key to verify provenance (akin to signature)
--range <start-end> Byte-range either as <start-end> or just <start> (Start included, End excluded)
-t, --trim Keep only header packets that you can decrypt
--header <path> Where to write the header (default: stdout)
--header-only Whether the input data consists only of a header (default: false)
Environment variables:
C4GH_LOG If defined, it will be used as the default logger
C4GH_SECRET_KEY If defined, it will be used as the default secret key (ie --sk ${C4GH_SECRET_KEY})
C4GH_PASSPHRASE If defined, it will be used as the passphrase
for decoding the secret key, replacing the callback.
Note: this is insecure. Only used for testing
C4GH_DEBUG If True, it will print (a lot of) debug information.
(Watch out: the output contains secrets)
つまり環境変数にC4GH_PASSPHRASE
という名前でパスワードを登録しておけば、これを参照しにいく。
# 環境変数を確認 ➔ C4GHで始まるものはない
env | grep C4GH
# 環境変数を登録
export C4GH_PASSPHRASE=〇〇
# 環境変数を確認 ➔ C4GH_PASSPHRASEの内容が表示される
env | grep C4GH
出力ファイル名
crypt4gh decrypt
は明示的にリダイレクト先のファイル名を指定しなければならないので、繰り返し処理の中で出力ファイル名も自動で設定させなければならない。
本記事の暗号化ファイルは、元のファイル名の前後にIDやらが追記されており、「prod_ega-box-429_encrypted_元ファイル名.1620591546353.c4gh」という風なファイル名になっている。
sed
コマンドで元ファイル名の部分だけを抜き出す。
雑な一例だが、こんな風に元ファイル名の箇所をキャプチャーして返すことができる。
FILENAME=prod_ega-box-429_encrypted_元ファイル名.1620591546353.c4gh
echo $FILENAME | sed "s/.*encrypted_\(.*\)\..*.c4gh/\1/"
※ ここではsed
コマンドの解説はしない。またキャプチャーは何通りもやり方があるのでここで紹介する以外でももちろん構わない。
for分の中で入力ファイル名を受け取り、元ファイル名を取り出す処理を加えて書き出しファイル名に使用することとする。
繰り返し処理の実行
以下に必要なコマンドを記載したスクリプトを用意した。変数やsed
のキャプチャーは自身の環境に合わせて使用してほしい。
(本記事の例では元ファイル名に「scRNA...fastq.gz」というパターンがあったので、これをsed
でキャプチャーしている。)
# 変数設定
FILE_DIR=<encrypt fileがあるディレクトリパス>
OUT_DIR=<出力先ディレクトリパス>
KEY_FILE=<秘密鍵ファイルのパス Ex) /mnt/c/Users/admin/.ssh/id_ed25519>
# 環境変数にPasswordを登録
export C4GH_PASSPHRASE=〇〇
# ファイル一覧を取得
FILEPATHS=$(ls ${FILE_DIR}*.c4gh)
# 出力先フォルダへ移動
cd $OUT_DIR
# 繰り返し処理
for FILEPATH in $FILEPATHS
do
echo $FILEPATH ;\
OUTFILE_NAME=$(echo $FILEPATH | sed "s/.*\(scRNA.*fastq.gz\).*/\1/") ;\
echo $OUTFILE_NAME ;\
crypt4gh decrypt --sk $KEY_FILE < "$FILEPATH" > $OUTFILE_NAME
done
crypt4gh decryptの繰り返し処理画面
「Warning: Using a passphrase in an environment variable is insecure」という警告が出るが、処理自体は進んでいく。
方法2『 PyEGA3 』
EGAのビデオチュートリアルでPyEGA3を用いた方法が紹介されている。
インストール
こちらのGitHubからツールのインストールが可能。
https://github.com/EGA-archive/ega-download-client#ega-download-client-pyega3
pip3 install pyega3
エラーメッセージは出たが、pyega3-5.2.0はインストールできている。
pip3 install pyega3 --upgrade
Credential fileの用意
EGAのユーザー名とログインパスワードを記載したjsonファイルが必要。
GitHubにひな形があるので、ダウンロードして自分用に書き換えると良い。
{
"username": "ega-test-data@ebi.ac.uk",
"password": "egarocks"
}
ダウンロード可能なdatasetを確認
-cf
フラグをたてcredential fileのファイルパスを指定するとEGAのserverに接続される。その上でdatasets
フラグを立てるとダウンロード可能なアクセッション番号の一覧が確認できる。
pyega3 -cf <credential_file.json> datasets
ダウンロード可能なdataset一覧
ダウンロード可能なFile IDを確認
file
フラグとdataset IDを指定すると、dataset内のFile IDが確認できる。
pyega3 -cf <credential_file.json> files <EGAD0000....>
ダウンロード可能なFile ID一覧(1つのdataset内)
ダウンロード
fetch
フラグをたててアクセッション番号を指定することでダウンロードされる。dataset IDの場合は、dataset内の全てのファイル、File IDの場合はそのファイルがダウンロードされる。
保存先フォルダは事前に作っておく。
pyega3 -cf <credential_file.json> fetch <EGAD0000....> --output-dir <保存先ディレクトリパス>
dataset IDを指定した場合も、dataset内のファイルを1つずつダウンロードしていく。
私のネット環境だと一晩かかって30GB弱。datasetが巨大だと何日もかかる勢い。
Discussion