mei_13のPython講座 ロゴ

【解説】AWSをPythonで自由に操作する「Boto3」の基本と実践




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

AWSをPythonで自由に操作する「Boto3」の基本と実践


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日はPythonを使ってAWS(Amazon Web Services)を操作するためのライブラリ、「Boto3」についてお話ししようと思います。クラウドの操作をプログラムから行うのは、最初は少し難しく感じるかもしれませんが……一つずつ紐解いていけば、きっとHirokiくんにも使いこなせるようになると思います。


Hirokiのアイコン
【Hiroki】 Yukiさん、よろしくお願いします!AWSは触ったことがありますが、いつもブラウザの管理画面(マネジメントコンソール)からポチポチ操作していました。Pythonから操作できるようになると、どんな良いことがあるんですか?


Yukiのアイコン
【Yuki】 そうですね……。例えば、毎日決まった時間にバックアップを取ったり、何百台ものサーバーの状態を一気に確認したりするのは、手動ではとても大変ですよね。Boto3を使えば、そういった定型作業を自動化したり、自分だけの便利なツールを作ったりすることができるんです。少しずつ、その魅力をお伝えできれば嬉しいです。

Boto3とは何か


Yukiのアイコン
【Yuki】 まず、Boto3(ボトスリー)が何者なのかというお話から始めますね。これはAWSが公式に提供しているPython用のSDK(Software Development Kit)です。 AWSには「API」という、プログラムから命令を受け付ける窓口があるのですが、Boto3はその窓口とPythonを繋いでくれる「通訳さん」のような役割を果たしてくれます。


Hirokiのアイコン
【Hiroki】 なるほど、通訳さんですか。Pythonのコードを書けば、Boto3がそれをAWSが理解できる形式に変換して伝えてくれる、というイメージで合っていますか?


Yukiのアイコン
【Yuki】 はい、その通りです。ちなみに「Boto」という名前は、アマゾン川に住むアマゾンカワイルカに由来しているそうですよ。バージョン3なのでBoto3と呼ばれています。今の主流はこのBoto3なので、これを覚えておけば間違いはないと思います……たぶん。

環境準備とインストール


Yukiのアイコン
【Yuki】 それでは、実際にBoto3を使うための準備をしましょう。まずはインストールですが、これはいつもの pip コマンドで行えます。

pip install boto3


Hirokiのアイコン
【Hiroki】 インストールは簡単ですね!これだけで準備完了ですか?


Yukiのアイコン
【Yuki】 いえ、実は一番大切な設定が残っています。AWSを操作するためには、「誰が操作しているのか」を証明するための認証情報(アクセスキーとシークレットアクセスキー)をPCに設定する必要があるんです。 通常は、AWS CLIをインストールして aws configure コマンドで設定するのが一般的ですね。


Hirokiのアイコン
【Hiroki】 あ、それなら以前設定したことがあります! ~/.aws/credentials というファイルに保存されるやつですよね。


Yukiのアイコン
【Yuki】 流石ですね、Hirokiくん。Boto3は実行されるときに、その設定ファイルを自動的に探しに行ってくれるので、一度設定してしまえばコードの中に直接パスワードなどを書かなくて済むんです。セキュリティの観点からも、認証情報はコードに直接書かないのが鉄則ですよ。

クライアント(Client)とリソース(Resource)の違い


Yukiのアイコン
【Yuki】 Boto3を使い始めるとき、初心者の人が一番迷いやすいのが、「クライアント(Client)」「リソース(Resource)」という2つのインターフェースがあることです。


Hirokiのアイコン
【Hiroki】 2つもあるんですか……?どう使い分ければいいんでしょう。


Yukiのアイコン
【Yuki】 簡単に言うと、このような違いがあります。

  • クライアント(Client): AWSのAPIと1対1で対応する低レベルなインターフェースです。すべての機能を網羅していますが、返ってくるデータが複雑な辞書形式(JSON)なので、少し扱いにくいかもしれません。
  • リソース(Resource): PythonのオブジェクトとしてAWSの資源を扱える高レベルなインターフェースです。直感的に書けますが、すべてのサービスに対応しているわけではありません。


Hirokiのアイコン
【Hiroki】 うーん、最初はどちらを使えばいいんでしょうか。


Yukiのアイコン
【Yuki】 最初は、よりPythonらしく書ける「リソース」から触ってみるのが良いと思います。もしリソースでできないことがあれば、その時に「クライアント」を使う、というスタンスで十分ですよ。

S3のバケット一覧を表示してみる


Yukiのアイコン
【Yuki】 では、実際にコードを書いてみましょう。まずはクラウド上のストレージサービスであるS3(Simple Storage Service)のバケット一覧を取得するプログラムです。リソースを使った書き方を見てみてください。

import boto3

# S3のリソースを作成します
s3 = boto3.resource('s3')

# すべてのバケットをループで回して名前を表示します
for bucket in s3.buckets.all():
    print(f"バケット名: {bucket.name}")


Hirokiのアイコン
【Hiroki】 わあ、すごく短いですね! s3.buckets.all() だけで一覧が取れるなんて、直感的でわかりやすいです。


Yukiのアイコン
【Yuki】 そうですよね。これと同じことをクライアント(Client)で書くと、もう少し複雑な構造のデータを解析する必要が出てきます。Boto3の良さは、こうしたシンプルな記述でクラウドを制御できるところにあるんです。

ファイルのアップロードとダウンロード


Hirokiのアイコン
【Hiroki】 S3にファイルをアップロードするのも、簡単にできるんでしょうか?


Yukiのアイコン
【Yuki】 はい、もちろんです。例えば test.txt というファイルをアップロードする場合は、このように書きます。

import boto3

s3 = boto3.resource('s3')
bucket_name = 'hiroki-bucket-example' # 自分のバケット名に変えてくださいね

# ファイルをアップロード
s3.Bucket(bucket_name).upload_file('test.txt', 'uploaded_test.txt')

print("アップロードが完了しました...")


Hirokiのアイコン
【Hiroki】 upload_file というメソッドを呼ぶだけなんですね。これなら僕でも自動バックアップツールが作れそうな気がしてきました。


Yukiのアイコン
【Yuki】 ふふ、そう言ってもらえると嬉しいです。ダウンロードしたいときは download_file というメソッドを使えば大丈夫ですよ。引数の順番などに気をつければ、難しいことはないはずです。

EC2インスタンスの情報を取得する


Yukiのアイコン
【Yuki】 次は、仮想サーバーのサービスであるEC2(Elastic Compute Cloud)を操作してみましょう。現在動いているインスタンスのIDと状態を表示するコードです。

import boto3

ec2 = boto3.resource('ec2')

# インスタンスの一覧を取得して表示します
for instance in ec2.instances.all():
    print(f"ID: {instance.id}, 状態: {instance.state['Name']}")


Hirokiのアイコン
【Hiroki】 これもS3のときと似た書き方ですね。


Yukiのアイコン
【Yuki】 そうなんです。サービスが変わっても、基本的な使い方のルールが共通しているのがBoto3の使いやすいところですね。ちなみに、特定の条件に合うインスタンスだけを探したいときは、filter という機能を使うこともできます。

ページネーター(Paginator)の活用


Hirokiのアイコン
【Hiroki】 Yukiさん、ちょっと質問です。もしS3にバケットが1,000個以上あったり、EC2インスタンスが大量にあったりする場合、一度に全部取得できるんでしょうか?


Yukiのアイコン
【Yuki】 それはとても鋭い質問ですね。AWSのAPIは、一度に返せるデータの数に上限があることが多いんです。例えば1,000件まで、といった具合に。そんな時に役立つのが「ページネーター(Paginator)」という機能です。


Hirokiのアイコン
【Hiroki】 ページネーター……本のページをめくるようなイメージですか?


Yukiのアイコン
【Yuki】 はい、まさにその通りです。クライアント(Client)を使って、このように書きます。

import boto3

client = boto3.client('s3')

# ページネーターを作成します
paginator = client.get_paginator('list_objects_v2')

# バケット内のオブジェクトをページごとに取得します
page_iterator = paginator.paginate(Bucket='hiroki-bucket-example')

for page in page_iterator:
    if 'Contents' in page:
        for obj in page['Contents']:
            print(obj['Key'])


Yukiのアイコン
【Yuki】 こうすることで、どれだけ大量のデータがあっても、Boto3が裏側で「次のページをください」というリクエストを自動で繰り返してくれるんです。大量のデータを扱う実務では、このページネーターは欠かせない機能になると思います。

ウェイター(Waiters)で状態の変化を待つ


Yukiのアイコン
【Yuki】 もう一つ、知っておくと便利な機能に「ウェイター(Waiters)」があります。例えば、EC2インスタンスを新しく作成した直後、まだ「起動中」の段階では、ログインしたり設定を変更したりすることはできませんよね。


Hirokiのアイコン
【Hiroki】 そうですね。いつも管理画面で「実行中」に変わるまでリロードして待っていました。


Yukiのアイコン
【Yuki】 それをプログラムで自動的に行ってくれるのがウェイターです。「特定の状態になるまでプログラムを一時停止して待つ」という処理を、1行で書けるんです。

import boto3

ec2_client = boto3.client('ec2')

# インスタンスを起動
# ec2_client.start_instances(InstanceIds=['i-xxxxxx'])

# インスタンスが「running」状態になるまで待ちます
waiter = ec2_client.get_waiter('instance_running')
waiter.wait(InstanceIds=['i-xxxxxx'])

print("インスタンスが起動しました。次の処理に移ります...")


Hirokiのアイコン
【Hiroki】 これは便利ですね! time.sleep(10) とかで適当に待つよりも、ずっと正確で安全そうです。


Yukiのアイコン
【Yuki】 そうですね…… sleep だと時間が足りなかったり、逆に待ちすぎたりしてしまいますから。AWSの状態を正確に把握して次に進む、スマートなプログラムを書くためには必須のテクニックです。

エラーハンドリングの重要性


Yukiのアイコン
【Yuki】 最後に、少しだけ大切な話をしますね。クラウドを操作するプログラムを書くときは、必ずエラーが起きることを想定しておかなければいけません。ネットワークが一時的に切れたり、権限が足りなかったりすることはよくあるからです。


Hirokiのアイコン
【Hiroki】 例外処理ですね。 try-except を使うんでしょうか?


Yukiのアイコン
【Yuki】 はい。Boto3専用の例外クラスが用意されているので、それを使うとより詳しく原因を調べることができます。

import boto3
from botocore.exceptions import ClientError

s3 = boto3.client('s3')

try:
    s3.list_objects_v2(Bucket='non-existent-bucket')
except ClientError as e:
    # エラーコードを確認して処理を分岐できます
    error_code = e.response['Error']['Code']
    if error_code == 'NoSuchBucket':
        print("指定されたバケットが存在しません...")
    else:
        print(f"予期せぬエラーが発生しました: {e}")


Yukiのアイコン
【Yuki】 このように、どんなエラーが起きたのかをちゃんと捕まえてあげることで、止まりにくい頑丈なシステムになるんです。Hirokiくんも、本格的なツールを作るときは意識してみてくださいね。

まとめ


Hirokiのアイコン
【Hiroki】 Yukiさん、今日はありがとうございました!Boto3って、もっとお堅いイメージがあったんですけど、実際にコードを見てみるとPythonらしくて書きやすそうですね。


Yukiのアイコン
【Yuki】 そう言ってもらえて、私も安心しました。最初は「リソース」を使って簡単な操作から始めて、徐々に「クライアント」や「ページネーター」を組み合わせていくのが上達の近道だと思います。 AWSは機能が膨大なので、すべてを覚える必要はありません。公式ドキュメントを片手に、その都度必要な部分を調べていくのがコツですよ。


Hirokiのアイコン
【Hiroki】 公式ドキュメント、読んでみます!


Yukiのアイコン
【Yuki】 はい、ぜひ。Boto3のドキュメントは非常に充実しているので、眺めているだけでも「こんなこともできるんだ」という発見があって楽しい……かもしれません。 Boto3 Documentation もし詰まってしまったら、いつでも聞いてくださいね。静かな夜なら、私もゆっくりと一緒に考えられると思いますから。


Hirokiのアイコン
【Hiroki】 心強いです。さっそく、自分のS3バケットを整理するスクリプトを書いてみます!


Yukiのアイコン
【Yuki】 頑張ってくださいね、Hirokiくん。応援しています。


情報の根拠・参考サイト: - Boto3公式ドキュメント - AWS SDK for Python (Boto3) - AWS公式



< Ansible
コラム一覧に戻る
Terraform >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki