WEB

EC2にあるファイルをS3に転送する方法

はじめに

S3にテストのために大量にファイルをアップしたかったのですが、AWSコンソールでローカルから1000ファイルずつちまちまとアップロードしていたら、時間もかかるし費用もかかるしで効率が悪いので、EC2を立ち上げてそこでファイルを生成し、S3にアップすることにしました。同一リージョン内のEC2とS3間の通信は無料です。

EC2の立ち上げについてはこちら

https://gri.jp/media/entry/35209

EC2にS3のファイルアップロードの権限を付与する

EC2に割り当てるロールを作成する

IAMのロールから、「ロールを作成」

エンティティタイプで「AWSのサービスを選択」

ユースケースでEC2を選択

許可を追加で、何も選択しないで次へを押します。

名前をつけて「ロールを作成」ボタンを押します

対象のEC2のロールを、先ほどつくったIAMロールに変更する

IAMロール変更画面でさきほど作ったIAMロールを選択して「IAMロールの更新」をする

S3アクセスのポリシーを作成する

「ポリシーの作成」画面でアップロード対象のS3のPUT、GET、LISTの権限があるポリシーを編集する

ポリシーエディタの記述は以下のようにしています

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": [
				"s3:PutObject",
				"s3:GetObject"
			],
			"Resource": "arn:aws:s3:::バケット名/*"
		},
		{
			"Effect": "Allow",
			"Action": "s3:ListBucket",
			"Resource": "arn:aws:s3:::バケット名",
			"Condition": {
				"StringLike": {
					"s3:prefix": "*"
				}
			}
		}
	]
}

ポリシー名をつけて、「ポリシーを作成」ボタンを押す

作成したポリシーをロールに割り当てる

これで、EC2からS3へのPUT、GET、LISTが許可されました。

EC2からS3にアクセスしてみる

AWSのCLIはすでにインストールされているようでした。ので、対象バケットをリストしてみます。

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ aws --version
aws-cli/2.15.30 Python/3.9.16 Linux/6.1.109-118.189.amzn2023.x86_64 source/x86_64.amzn.2023 prompt/off
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ aws s3 ls s3://バケット名
                           PRE aaa/
                           PRE bbb/
                           PRE upload/

 

EC2のファイル生成ディレクトリから、S3の該当ディレクトリにファイルを転送する。(1つ1つではなくて、ディレクトリにあるファイル全てを一括で上げたい)

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ aws s3 cp ./output_dir s3://バケット名/upload/test/ --recursive

※この場合、output_dir以下にあるファイルがupload/test/直下にコピーされる

まとめ

EC2に割り当てたIAMロールに対して、対象のS3の読み書き権限を与えて、SSHからAWSのCLIコマンドでデータを自腹からバケットにアップロードする、という流れが理解できました。

reiko suzuki
OLD SKOOLシステムエンジニア。ねこを撫でながら働いています。