はじめに

Webサヌバヌ䞊で皌働するアプリは、゜ヌスの管理にはCodeCommitが、自動デプロむずしおはCodePipeline + CodeDeploy + CodeCommitビルドが必芁な堎合は + CodeBuildなどの構成が䜿われたすが、CodeCommitではサむズの倧きなファむルを管理するこずは適しおいたせん。
そのようなサむズの倧きなのファむルをデプロむする方法ずしお、ファむルをS3䞊に配眮し、aws-cliを䜿甚しお取埗及び配眮するシェルを考えおみたした。

前提条件

・察象のEC2のIAMロヌルに察象のS3ぞのGETずLISTの暩限が付䞎されおいるこず。
・EC2にaws-cliのVersion2がむンストヌルされおいるこずversion 2.15.24にお確認。
・今回のサンプルではS3バケットsapmle-bucketを甚意し、その配䞋にそれぞれ以䞋のようなディレクトリずファむルが配眮されおいるこずずしたす。

[sapmle-bucket]バケット
  - [testDir]ディレクトリ
    - [test1.txt]ファむル
    - [test2.txt]ファむル
    - [test3.txt]ファむル

・EC2ずS3は同䞀リヌゞョンに存圚するものずしお説明したす。
・EC2内でのナヌザヌはtest_userずしたす。
・シェルに぀いおはBASHでの蚘茉方法になりたす。

シェルでの凊理内容

  1. S3から取埗したファむルを配眮するディレクトリぞ移動する
  2. aws-cliを䜿甚しおS3の特定のバケット及びフォルダ内のファむル䞀芧からファむル名を取埗する
  3. aws-cliを䜿甚しおS3からファむルを取埗する

手順1. S3から取埗したファむルを配眮するディレクトリぞ移動する

たずは以䞋のコマンドでディレクトリを移動したす。
ディレクトリに関しおはシェルを実行するナヌザヌが暩限を保持しおいれば奜きな堎所で問題ありたせん。今回は/home/test_user/配䞋ずしたす

cd /home/test_user

手順2. aws-cliを䜿甚しおS3の特定のバケット及びフォルダ内のファむル䞀芧からファむル名を取埗する

aws-cliを䜿甚しおS3のバケットやオブゞェクトの䞀芧衚瀺を取埗するには以䞋の構文を䜿甚したす。

$ aws s3 ls {target} [--options]

{target}には「s3://」に続いおバケット名やディレクトリを「/」区切りで指定したす。
今回の堎合は「s3://sample-bucket/testDir/」ずなりたす。
[–options]にはバケットが配眮されおいるリヌゞョンを指定する「–region」や、クレデンシャルを指定する「–profile」などがありたすが、今回は特に指定したせん。
オプションの詳现はAWS公匏のドキュメントにたずたっおいたす。
コマンドを実行しおみるず以䞋のような結果になりたす。

$ aws s3 ls s3://sample-bucket/testDir/
2024-03-20 00:00:10 0
2024-03-20 00:00:27 6 test1.txt
2024-03-20 00:00:55 6 test2.txt
2024-03-20 00:00:43 6 test3.txt

䞊蚘はファむルたたはディレクトリの「䜜成日 䜜成時間 サむズ ファむル名」ずなっおおり、サむズが0の芁玠がディレクトリtestDirになりたす。
埌続の手順3におS3からファむルを取埗する際にファむル名が必芁になるのですが、珟状だずファむル名以倖の䞍芁な情報が含たれおおり、ディレクトリ内にある耇数のファむル名ディレクトリ名が取埗されおしたすので、awkコマンドにおファむル名だけを抜出し、headコマンドでファむル名を1぀に絞りたす。

$ aws s3 ls s3://sample-bucket/testDir/ | awk '{print $4}' | head -n 1
 

䞊蚘のコマンドの結果だず、aws-cliのS3のlsコマンドの結果の先頭にあるディレクトリ名空文字ずなっおしたいたす。
そのため、sortコマンドにおファむルの䜜成日時やファむル名で降順゜ヌトするこずで察応したす。
ファむルの䜜成日時で降順゜ヌトする堎合

$ aws s3 ls s3://sample-bucket/testDir/ | sort -r | awk '{print $4}' | head -n 1
test2.txt

ファむル名で降順゜ヌトする堎合

$ aws s3 ls s3://sample-bucket/testDir/ | awk '{print $4}' | sort -r | head -n 1
test3.txt

手順3. aws-cliを䜿甚しおS3からファむルを取埗する

aws-cliを䜿甚しおS3のバケットやオブゞェクトからファむルを取埗する堎合は以䞋の構文を䜿甚したす。

aws s3 cp {target} [--options] {target-dir}

{target}には「s3://」に続いおバケット名やディレクトリ、ファむル名を「/」区切りで指定したす。
[–options]にはlsず同じようにいく぀かのオプションが甚意されおいたす。
オプションの詳现はAWS公匏のドキュメントにたずたっおいたす。
{target-dir}はS3から取埗したファむルを配眮するEC2䞊のディレクトリのパスを指定したす。
今回は珟圚のディレクトリ配䞋ずする「./」を指定したす。
コマンドずしおは以䞋のような圢になりたす。

aws s3 cp s3://sample-bucket/testDir/「手順2で取埗したファむル名」 ./

手順を組み合わせおシェルファむルを䜜る

䞊蚘の手順を螏たえお、「S3の指定されたディレクトリにある最新のファむルを1぀取埗する」シェルを䜜成しおみたす。
今回のシェルファむルは「/home/test_user/get_latest_file_from_s3.sh」ずしたす。

#!/bin/bash

# S3から取埗したファむルを配眮するディレクトリぞ移動する
cd /home/test_user

# aws-cliを䜿甚しおS3の特定のバケット及びフォルダ内のファむル䞀芧からファむル名を取埗するファむルの䜜成日時降順
TARGET_FILE=`aws s3 ls s3://sample-bucket/testDir/ | sort -r | awk '{print $4}' | head -n 1`

# aws-cliを䜿甚しおS3からファむルを取埗する
aws s3 cp s3://sample-bucket/testDir/${TARGET_FILE} ./

䞊蚘のシェルでは最新ファむルの取埗たでしか行っおいたせんが、さらにコマンドを远加するこずでダりンロヌドしたファむルを開いたり起動したりなども自動化するこずができたす。

最埌に

シェルファむルの準備ができたら、シェルファむルに実行暩限を付䞎しお盎接実行する、EC2の起動時に実行されるようにナヌザヌデヌタに登録する、systemdに登録しお自動起動するなど色々ずできたす。
aws-cliのS3には他にもバケットを䜜成するためのmbコマンドや、オブゞェクトを削陀するためのrmコマンド等、色々なコマンドが甚意されおいたす。
今回は䜿甚しおいないコマンドに぀いおも䜿い方は難しくないのでAWS曎新ペヌゞ「AWS CLI で高レベル (S3) コマンドを䜿甚する」を参考にしおください。