Rclone を使った Azure Blob Storage から Amazon S3 へのオブジェクト同期を ECS でタスク実行してみた

2023.01.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

前回はローカル環境上で Rclone を使って Azure Blob Storage から Amazon S3 へオブジェクトを同期する方法を試してみました。

最終的には自動化したいのでクラウド上で実行出来るようにしておきたいところです。

いくつかホスティングオプションが考えられそうですが、今回は勉強がてら私の経験の浅い Amazon ECS 上でタスクとして実行してみたいと思います。
タスク実行まで出来ればスケジュール実行は簡単に出来そうですよね。

コンテナイメージの作成

まず、以下のような Dockerfile を用意しました。
Rclone インストールの過程で curl と bash と install.sh で unzip 使っているのでインストールします。
また、Rclone の実行にあたって AWS CLI が必要なのでそちらもインストールしておきます。
Alipine の AWS CLI v2 インストールは面倒なので v1 にしました。

Dockerfile

FROM alpine:latest
RUN apk update
RUN apk add curl bash unzip aws-cli

# Install Rclone
RUN curl https://rclone.org/install.sh | bash
RUN mkdir /var/hoge
COPY ./rclone.conf /var/hoge/rclone.conf

# Clone Azure Storage to Amazon S3
CMD rclone --config "/var/hoge/rclone.conf" sync azureblob:${AZUREBLOB_CONTAINER} s3:${AWS_PATH} --azureblob-account ${AZUREBLOB_ACCOUNT} --azureblob-key ${AZUREBLOB_KEY}

rclone.conf

[s3]
type = s3
provider = AWS
env_auth = true
region = ap-northeast-1
location_constraint = ap-northeast-1
acl = private
server_side_encryption = AES256
storage_class = STANDARD

[azureblob]
type = azureblob

RClone の構成ファイルをコピーしていますが、内容は少し前回から変更しています。
Azure 側の共有キーとストレージアカウントはコマンドのオプションで引き渡すことが出来るので環境変数から読み込むことにしました。
ちなみに Rclone のグローバルオプション(--config)で 構成ファイルは任意のパスを指定することが出来ます。

ビルドしてコンテナレジストリ(今回は Amazon ECR)へプッシュしましょう。

% docker build --platform linux/amd64 . -t hoge0110rclone:v10
[+] Building 21.5s (11/11) FINISHED                                                                                                     

:

% aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

:

% docker tag 9f1252293d90 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws:v1

% docker images
REPOSITORY                                                              TAG       IMAGE ID       CREATED             SIZE
hoge0110rclone                                                          v10       9f1252293d90   8 minutes ago       262MB
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws   v1        9f1252293d90   8 minutes ago       262MB

:

% docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws:v1
The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws]
4936efb8fece: Pushed 
932515da7b2e: Pushed 
50e5da887abd: Pushed 
994b82cb9b62: Pushed 
e2f2111cf956: Pushed 
8e012198eea1: Pushed 
v1: digest: sha256:adbc3197354d3163f4820b0eeacd5b6e01ffbc0fc7161ca03788fe55cfaaefd5 size: 1577

ECR リポジトリに登録出来ていることを確認しました。

タスク定義を作成

こちらの記事を参考にタスク定義を作成して適当なクラスターで実行します。

今回 Azure 側のキーを環境変数へプレーンテキストで渡してしまっているのですが、これだとマネジメントコンソールやタスク定義を API 取得するとキーが取得出来てしまうので良くないですね。
セキュリティベストプラクティスとしては以下のように Sysmtes Manager Parameter Store や Secrets Manager に格納した上で、ValueFromを使って環境変数へ引き渡しましょうとされていますのでそちらを参考にしてください。

Azure へのアクセスはストレージ共有キーを使いますが、Amazon S3 へのアクセスはタスクロールを使ってアクセスさせるので、Amazon S3 へのアクセスを許可したロールを設定します。

クラスターでタスクを実行して確認

最後に、作成出来たらタスクを実行してみます。

タスクが完了したら S3 バケットを確認してみましょう。

Azure Blob Storage のオブジェクトが同期されていました。
これでローカル環境を用意せずにクラウド間のオブジェクト同期が実現出来るようになりました。

さいごに

本日は Rclone を使った Azure Blob Storage から Amazon S3 へのオブジェクト同期を ECS でタスク実行してみました。

次回あたりにタスクを定期実行させた上で、何らかの Azure 上の Blob ストレージ上のデータを AWS 上で可視化したいなと思います。