S3 でファイルを保存して取得する

AWSBeginner
オンラインで実践に進む

はじめに

レポート作成チームは日次売上レポートを保存し、現在のコピーを取得する必要があります。S3 バケットを作成してレポートをアップロード、更新し、ダウンロードを確認して、練習用リソースを削除します。

最初に LabEx で AWS を使い始める を完了してください。この新しい VM には CLI 接続と report.txt が準備済みで、個人の AWS へのログインや以前のリソースは必要ありません。コマンドには Terminal を使い、隣の AWS View タブでこの実験のストレージを観察します。

認定試験との関連

このラボでは、次の試験トピックに関連する実践的な演習を行います。

ストレージバケットを作成する

このステップでは、日次売上レポート用のバケットを作成し、AWS View で観察します。

作業ディレクトリに移動します。cd はターミナルの現在のディレクトリを変更します。この実験のローカルファイルはすべて、このディレクトリを使います。

cd /home/labex/project

準備済みの公式 CLI のバージョンを確認します。

aws --version

出力は aws-cli/2.37.6 で始まります。イメージがツールを既に提供しているため、ストレージの操作に集中できます。

Amazon S3 はファイルの内容をオブジェクトとして保存します。バケットはそれらのオブジェクトを格納し、キーはその中の一つのオブジェクトの名前です。まず格納先を作成し、次にレポートをアップロードします。

labex-backups を作成します。aws s3 mb の s3 はオブジェクトストレージを選び、mb は make bucket(バケットを作成する)を意味します。s3:// プレフィックスはストレージの場所を表し、ローカルフォルダーではありません。

aws s3 mb s3://labex-backups

予想される出力:

make_bucket: labex-backups

list(一覧表示)を意味する ls でバケットを一覧表示します。

aws s3 ls

末尾が labex-backups の行が表示されるはずです。日時は異なります。AWS View のプレビューには、オブジェクトがない labex-backups カードが表示されます。矢印は CLI とストレージのつながりを示し、バケットのノードは実際のリソースへの問い合わせを反映します。

レポートをアップロードして確認する

このステップでは、レポートを S3 オブジェクトとして保存し、プレビューで実際に保存された内容を読み取ります。

ローカルファイルと保存されたコピーは別のものです。アップロードとダウンロードがそれらをつなぎます。

ローカルのコピーと保存されたコピー

準備済みのローカルファイルを確認します。cat はテキストファイルの内容を表示します。

cat report.txt

予想される出力:

Daily sales: 120 orders

cp は copy(コピーする)を意味します。次の最初のパスはローカルのコピー元、二つ目はコピー先です。バケット名の後の report.txt がオブジェクトのキーです。

aws s3 cp report.txt s3://labex-backups/report.txt

出力は、report.txt から s3://labex-backups/report.txt へのアップロードを示します。

バケットのオブジェクトを一覧表示します。

aws s3 ls s3://labex-backups/

report.txt の行には更新日時、サイズ、キーが表示されます。アップロードは独立した保存済みコピーを作成します。ローカルファイルを編集するだけでは、それは変わりません。

AWS View のバケットカードには 1 個のオブジェクトが表示されます。カードの report.txt をクリックし、内容を展開します。プレビューには Daily sales: 120 orders と表示されるはずです。これはローカルの元ファイルではなく、保存されたオブジェクトを読み取っています。

次の例は、バケットカード内でアップロード済みのレポートを展開した状態です。内容はストレージから読み取られています。

保存されたレポートと S3 のトポロジー

保存されたコピーを更新して取得する

このステップでは、レポートを置き換え、現在保存されているバージョンをダウンロードして、往復しても内容が保持されたことを証明します。

更新したレポートには 145 件の注文が含まれます。printf はテキストを書き込み、\n は改行を追加します。シェルの > 演算子は、指定した名前のローカルファイルの内容を置き換えます。

printf 'Daily sales: 145 orders\n' > report.txt

もう一度アップロードする前に、レポートのプレビューを見てください。保存されたコピーは変わっていないため、引き続き 120 orders と表示されます。

同じキーにアップロードし、現在の内容を置き換えます。

aws s3 cp report.txt s3://labex-backups/report.txt

プレビューは 145 orders になり、オブジェクト数は 1 のままです。キーを再利用すると、そのオブジェクトが更新されます。この実験では、二つ目の名前付きオブジェクトが作成されるわけではありません。

cp の方向を逆にしてダウンロードします。今度は S3 のパスがコピー元で、downloaded.txt は新しいローカルのコピー先です。

aws s3 cp s3://labex-backups/report.txt downloaded.txt

ダウンロードしたファイルを確認します。

cat downloaded.txt

予想される出力:

Daily sales: 145 orders

cmp は二つのファイルをバイト単位で比較します。同じ場合は何も表示せず、正常に終了します。&& は、その比較が成功した場合だけ後続のコマンドを実行します。

cmp report.txt downloaded.txt && echo 'Round trip verified'

予想される出力:

Round trip verified

この比較は、取得した内容が更新後の元ファイルと一致することを証明します。このステップの検証は、S3 を独立して読み取り、保存された内容とダウンロードした内容を比較します。

ストレージを削除する

このステップでは、空でないバケットを削除できない理由を学び、この実験のオブジェクトとバケットを削除します。

rb は remove bucket(バケットを削除する)を意味します。まず、レポートがまだ存在する状態で削除を試します。

aws s3 rb s3://labex-backups

このコマンドは BucketNotEmpty で失敗することが想定されています。この失敗から、リソースの依存関係を学べます。バケットはオブジェクトを格納するため、格納先を削除する前にオブジェクトを削除します。バケットとオブジェクトはプレビューに残るはずです。

rm は正確な S3 パスにあるオブジェクトを削除します。

aws s3 rm s3://labex-backups/report.txt

出力で delete: s3://labex-backups/report.txt を確認できます。オブジェクトはプレビューからなくなり、空のバケットが残ります。

次に、空のバケットを削除します。

aws s3 rb s3://labex-backups

予想される出力:

remove_bucket: labex-backups

サービスが引き続き応答し、残っているバケットがないことを確認します。

aws s3 ls

コマンドはバケットの行を表示せずに完了します。AWS View はリソースカードなしで No buckets を表示します。この状態は正常なサービスへの問い合わせから得られます。接続が切れたページでは削除を証明できません。ストレージのリソースは削除されましたが、ローカルのレポートファイルは引き続き利用できます。

次の削除後の表示では、状態の問い合わせが成功した後、バケットカードが残っていません。

削除後の空のストレージ

まとめ

公式 AWS CLI を使って、バケットの作成、オブジェクトのアップロードと置き換え、ダウンロード、ファイル内容の比較、ストレージリソースの削除を行いました。AWS View はコマンドと観察可能なリソースの変化を結びつけ、プレビューは実際に保存された内容を表示しました。

レポートの保存の一連の流れを練習しました。バケットでファイルを整理し、ローカルのコピーと保存されたコピーを区別し、ダウンロードを確認して、バケットを削除する前にオブジェクトを削除しました。