こんにちは、k_ukiです。
「AWSではじめるクラウド開発入門」の10章と11章を進めていきました。
そこでは、サーバーレスクラウドに関連する技術が取り上げられており、「Lambda」「DynamoDB」「S3」の3つの技術をハンズオン形式で学習しました。
その中でも、今回は「S3」について学んだことをまとめていきます。
「S3」とは?
S3はAWSが提供するサーバーレスなストレージのことです。
サーバーフルのストレージの場合、ディスクの容量の割り当てはディスクのフォーマットを行うときに決める必要があり、自由にサイズを変更することはできませんでした。そのため、従来のクラウドでストレージを借りる際は指定した領域のディスクをまるごと借りる必要がありました。(例えば、1GBのストレージを借りた場合、現在100mbしか使っていなくても1GB分の料金が発生する)
S3は基本的にAPIを通してデータの読み書きを行うため、OSにマウントするという概念自体が存在しません。そのことから、ディスク領域を指定する必要がなく、データを入れた分だけ領域が拡張されていきます。
S3を触ってみた
今回のハンズオンではSTEP1,STEP2の二つを実施しました。それぞれの内容は以下の通りです。
- STEP1: AWS CDKを使用し、S3に新しいバケットを生成する。
- STEP2: データのアップロード、ダウンロードを実践する。
STEP1
STEP1ではS3に新しいバケットを生成してみます。今回デプロイするプログラムは以下の通りです。
class SimpleS3(core.Stack):
def__init__(self, scope: core.App, name: str, **kwargs) -> None:
super().__init__(scope, name, **kwargs)
bucket = s3.Bucket(
self, "bucket",
removal_policy=core.RemovalPolicy.DESTROY,
auto_delete_objects=True,
s3.Bucket()メソッドを呼ぶことによって新しいバケットが新規作成されます。
また、s3はCloudFormationスタックが削除されたとしてもバケットとその中身は削除されないようにデフォルトで設定されています。
しかし、今回のハンズオンではデータを残す必要はないので以下のパラメータを追記し、スタックの削除と同時にs3のデータも削除されるようにしています。
removal_policy=core.RemovalPolicy.DESTROY,auto_delete_objects=True,
まず、プロジェクトのディレクトリに移動し以下のコマンドを実行しました。
# venvを作成し、依存ライブラリのインストール
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt
# デプロイの実行
$ cdk deploy
実行後、以下の文字列が返されました。正しくデプロイできたことがわかります。
STEP2
STEP2ではSTEP1で作ったバケットにアップロード、ダウンロードを行ってみます。
データのアップロード
まずは、データの書き込みを実践してみます。ここではハンズオンで用意されていた"simple_s3.py"を使用します。アップロードに使用するコードは以下の通りです。
def upload_file(bucket_name, filename, key=None):
bucket = s3.Bucket(bucket_name)
if key is None:
key = os.path.basename(filename)
bucket.upload_file(filename, key)
bucket = s3.Bucket(bucket_name)で作成したバケットを呼び出しています。また、upload_fileでファイルのアップロードを実行しています。
以下のコードを実行し"HelloWorld"という文字列が入ったファイルのアップロードを行います。
python simple_s3.py バケット名 upload tmp.txt --key a/b/tmp.txt
コンソールを確認すると無事ファイルがアップロードされたことが分かります。
データのダウンロード
次にアップロードしたtmp.txtのダウンロードを実行してみます。ダウンロードを担う部分のコードは以下の通りです。
def download_file(bucket_name, filename, filename=None):
bucket = s3.Bucket(bucket_name)
if filename is None:
filename = os.path.basename(key)
bucket.download_file(key, filename)
下記のコマンド実行後、正しくダウンロードされていることが確認できました。
python simple_s3.py バケット名 download tmp.txt
スタックの削除
演習は完了なので以下のコマンドでスタックを削除しました
$ cdk destroy
最後に
今回はS3についての学習と演習を行いました。今回の学習でAWSではじめるクラウド開発入門」の10章と11章を進めていきました。
そこでは、サーバーレスクラウドに関連する技術が取り上げられており、「Lambda」「DynamoDB」「S3」の3つの技術をハンズオン形式で学習しました。