はじめに

AWS S3 バケットをリネームする方法を調べた。

TL;DR

  • リネームはできないので、「新規バケット作成」&「ファイルコピー」で実現する
  • AWS CLIaws s3 sync s3://my-old-bucket s3://my-new-bucket で内容コピー
  • アプリケーションなどでバケットの参照先の変更漏れがないように注意

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. バケットのコピー
    2. 気をつけること
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.1
BuildVersion: 19B88

$ aws --version
aws-cli/1.16.215 Python/3.6.2 Darwin/19.0.0 botocore/1.12.205

詳細

リネームはできないので、新規バケットを作成して中身をコピーする。

バケットのコピー

S3 コンソール などでバケットを生成したら、aws s3 sync コマンドで内容をコピーする。

1
2
3
4
5
6
$ aws configure
$ aws s3 sync s3://my-old-bucket s3://my-new-bucket
copy: s3://my-old-bucket/1.txt to s3://my-new-bucket/1.txt
copy: s3://my-old-bucket/2.txt to s3://my-new-bucket/2.txt
copy: s3://my-old-bucket/3.txt to s3://my-new-bucket/3.txt
...

コピーが終わったら、バケットの内容に差分がないかを確認。

aws s3 ls --recursive s3://bucket-name --summarize で概要が出力できるので、オブジェクト数や合計サイズが一致していれば OK。

1
2
3
4
5
6
7
8
9
10
11
12
$ aws s3 ls --recursive s3://my-old-bucket --summarize > a.txt
$ aws s3 ls --recursive s3://my-new-bucket --summarize > b.txt
$ tail -n5 a.txt b.txt
==> a.txt <==
...
Total Objects: 18937
Total Size: 1616674111

==> b.txt <==
...
Total Objects: 18937
Total Size: 1616674111

気をつけること

コピー後は旧バケットは削除すると思うので、参照先や権限周りの変更漏れに注意すること。

  • アプリケーション側での参照先バケットの変更
  • 画像などの asset ファイルの場合は public アクセス可に変更する
  • IAM のポリシーでアクセス可能なバケットを制限している場合は、新バケットにアクセスできるように変更する
    • fatal error: An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied のエラーになったら、たぶんポリシー周り
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-old-bucket",
+ "arn:aws:s3:::my-new-bucket",
"arn:aws:s3:::my-old-bucket/*",
+ "arn:aws:s3:::my-new-bucket/*"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
}
]
}

まとめ

  • リネームはできないので、「新規バケット作成」&「ファイルコピー」で実現する
  • AWS CLIaws s3 sync s3://my-old-bucket s3://my-new-bucket で内容コピー
  • アプリケーションなどでバケットの参照先の変更漏れがないように注意

参考文献

関連記事