【AWS】13章 boto3道場「S3道場」（前編）

# 13章「boto3道場」「S3道場」（前編）
こんにちは、k_ukiです。現在「AWSではじめるクラウド開発入門」という書籍の13章を進めています。
この章では、PythonからAWS APIを操作するためのライブラリ「boto3」の理解を「S3,DynamoDB」のハンズオンで深めていくということを行いました。その中でも今回は「S3」のハンズオンで学んだことをまとめていきます。
## 概要
- 空のバケットをデプロイ
- 【<b>LEVEL1</b>】Jupyter notebookを使用し、ローカルのディスクに保存されているデータを操作する。
前編はここまで
---
- 【<b>LEVEL2</b>】ディスク上ではなくメモリ上に保存されているデータを操作する。
- 【<b>LEVEL3</b>】署名付きURLを触ってみる。
[後編の記事はこちら](https://qiita.com/k_uki512/items/579831cab77efb3a5ddd)
## 空のバケットをデプロイ
まずはプロジェクトのディレクトリに移動し依存ライブラリのインストールを行います。
以下のコマンドを入力します。また、インストール完了後デプロイも同時に実行します。
```
$ cd handson/dojo/s3
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt
$ cdk deploy
```
実行後、以下のような文字列が表示されたら成功です。
以下の画像の青文字の部分の"simples3~~"の部分は後ほど使用するためコピーしておきます。
![13-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/e878ca78-1575-f609-0311-2f2d28a69f08.png)

## LEVEL1　ディスクに保存されているデータを操作する。
デプロイが完了したら、実際にコードを入力していきます。ここではJupyter Notebookを使用していきます。
※Jupyter Notebookはブラウザ上でコードの記述と実行ができる統合開発環境です。

以下のコマンドで起動します。
```
$jupyter notebook
```
表示されたURLでJupyter notebookにアクセスし、新しいノートブックを作成します。

作成後、実際にコードを入力していきます。
初めに、boto3ライブラリをインポートし、Session()オブジェクトを経由してs3のリソースを呼び出します。
```
import boto3
session = boto3.Session(profile_name="default")
s3 = session.resource("s3")
```
boto3とは、pythonでAWS APIを操作するためのライブラリのことです。

また、今回初めて出てきた Session()オブジェクトについても解説します。
Session()オブジェクトは、s3などのサービスに接続するために必要な<b>認証情報を格納するためのオブジェクト</b>となります。今回はデフォルトのプロファイルを使用するため、profile_nameに "default"を格納しています。

次に、バケット名を変数に定義します。
定義した後に、Bucket()オブジェクトを作成します。
```
bucket_name = "デプロイ時にコピーしたバケット名"
bucket = s3.Bucket(bucket_name)
```
これで、バケットの操作が可能になりました。
さっそくテキストファイルをアップロードしてみます。

ダミーのテキストファイル（tmp.txt）を生成して、バケットにアップロードします。
ここでは、同じファイルをmyfile1.txt,myfile2.txtという2つのファイル名でアップロードします。
```
with open("tmp.txt","w") as f:
    f.write("Hello world!")
bucket.upload_file("tmp.txt","myfile1.txt")
bucket.upload_file("tmp.txt","myfile2.txt")
```
アップロードが完了したので、バケットの中のファイルの一覧を取得します。
```
objects = bucket.objects.all()
for o in objects:
    print(o.key)
```
ここでは、bucketの中身をallメソッドで全て取得し、取得したオブジェクトを順番に出力しています。
実行後以下の結果が得られました。アップロードしたファイルが正しく出力されたことが分かります。
![13-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/3a2fba32-b47a-f758-8b81-6905fb169dd7.png)

次に、myfile01.txt のファイルサイズと最終更新日時を読みだしてみます。
```
obj = bucket.Object("myfile1.txt")
print(obj.content_length)
print(obj.last_modified)
```
<b>bucket.Object() </b>メソッドでmyfile1.txt を指定し、変数に格納してしています。
<b>content_length</b>で指定したオブジェクトのファイルサイズを読み取ることができます。
また、<b>last_modified</b>でオブジェクトの最終更新日時を取得することができます。

以下が実行結果です。
![13-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/3c22dcb2-aea7-5388-25f9-985891d3cdd7.png)

次に、バケット内のオブジェクトをローカルにダウンロードしてみます。コマンドは以下の通りです。
```
obj.download_file("downloaded.txt")
```
download_file()メソッドを使用することでバケット内のオブジェクトをダウンロードできます。
ローカル内を確認するとdownloaded.txt というファイルが作成されたことがわかります。
![13-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/1f90c95a-4f8b-30b1-1c43-f6ba6920334f.png)

LEVEL1の最後として、バケット内のオブジェクトを削除します。
```
obj.delete()
```
再度、オブジェクト一覧を取得するコマンドを入力したところ以下の結果が得られました。
myfile1.txt が削除したことが分かります。
![13-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/86262775-94ef-6e32-7e2f-29d49a7ac967.png)

以上でLEVEL1は完了です。
　文章量が長くなるので[後編](https://qiita.com/k_uki512/items/579831cab77efb3a5ddd)に続きます。