AWS
PR

S3バケットの別プロファイル間のファイルコピー(AWS CLI)

ycsg113XYZ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

ミッション S3のバケットAにある大容量ファイルをバケットBにコピーせよ。

環境確認

お客様先のS3に10GBのファイルが100個も置いてあり、それを我々のS3にコピーする依頼がありました。我々の環境は、こんな感じ。

環境
  • バケットAのアクセスキー、シークレットキーは入手済み(参照権限)
  • バケットBのアクセスキー、シークレットキーは入手済み(書き込み権限)
  • AWS CLIがインストールされているEC2のLinux(ただしローカルディスクの空きは3GB)
  • バケットAもBもIP制限がかかっており、EC2のLinux端末からしか接続できない

図にしてみました。

↑今の環境の図

とりあえずLinux上から、バケットA、バケットBへそれぞれAWS configure へのprofileを作成しておく

aws configure --profile profileA
aws configure --profile profileB

方法検討


いつもならファイルサイズ大きくないので、バケットAからいったんLinuxローカルにコピー、次にLinuxローカルからバケットBにコピーって別々にやっておりました。

↑いつものコピー方法の図

今回の場合、ファイルは10GBあり、Linuxのローカルにいったん置くことが出来ません。

いろいろ記事を読んでみると、出来るのは出来るのですが、AWSのAMIを変更とか追加するとかしてaws syncせよって記事ばかり。

違うねん。

そういう変更するためにはAWSインフラ担当チーム様へお願いしなければならず、私ら下っ端の人間にはそういう権限ないねん。
もっとなんか

aws s3 cp s3://バケットA/ファイル.gz s3://バケットB/

みたいに気軽にコピーしたいねん。でもできないねん。引数でprofileは1つしか指定できないねん。

↑「こんな風にコピーしたい!」イメージ図

出来た!

そんなこんなで試行錯誤の末、標準入出力とパイプを使用し、以下のようにして出来ました!

aws s3 cp s3://バケットA/対象ファイル -
--profile==プロファイルA
| aws s3 cp - バケットB
--profile==プロファイルB

aws s3 cp s3://bucketA/targetfile.gz - --profile==profileA | aws s3 cp - s3://bucketB/ --profile==profileB
ポイント
  • ここでのポイントは「-(ハイフン)」です。
  • コピー先がハイフンの場合、標準出力へ渡します。
  • まず1つ目のAWSコマンドでS3バケットAから標準出力へコピー、それをパイプで渡し、2つ目のAWSコマンドで標準入力からS3バケットBにコピーしています。

あとがき

出来て良かったです。

この方法には注意点がございますので、それは別途課題ですね。

  • S3間の課金がどうなるかについては未検討です
  • もらっているアクセスキーの権限によってはこの方法が使えない可能性があります。(使えない場合は素直にあきらめましょう)
あつし
あつし

良かった~

スポンサーリンク
ABOUT ME
ひろし
ひろし
都内在中のなんちゃってSE。ギリギリPG。の私が管理者のひろしです。 日々夜遅くまで仕事に追われています。 今日は早く帰りたい・・・
スポンサーリンク
記事URLをコピーしました