はじめに
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コマンドでデータを自腹からバケットにアップロードする、という流れが理解できました。