AWSとPythonの連携：Boto3を活用したS3バケットの作成とEC2インスタンス起動の技術検証

## はじめに
AWS（Amazon Web Services）を利用していると、リソースの管理や操作を自動化したいと感じる場面が多々あります。

:::note warn
**そのようなニーズに応えるのが Boto3 というPythonライブラリです。**
:::

Boto3を使用すれば、AWSの各種サービスをPythonコードで簡単に操作でき、作業効率を大幅に向上させることが可能です。

本記事では、Boto3の概要から使い方、さらに実際のハンズオンを通じて、AWSリソースの操作方法を紹介していきます。

## Boto3とは
Boto3 は、AWSが公式に提供するPython SDK（Software Development Kit）です。
このライブラリを使うことで、AWSのAPIを簡単に呼び出し、AWSのサービスをプログラムで操作できます。

詳しい情報は公式サイトをご覧ください。

https://aws.amazon.com/jp/sdk-for-python/

### 主な特徴

Boto3は、AWSのさまざまなサービス（例：Amazon S3、Amazon EC2、Amazon DynamoDBなど）をPythonアプリケーションやスクリプトから容易に統合するためのツールです。

以下に主なサービスの特徴をご紹介します。

![スクリーンショット 2024-11-26 20.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cf9b0d0c-8c5b-cb9a-3d8d-d591c8c19b36.png)
引用画像：https://cloud5.jp/learning5-s31/

#### 1. AWSサービスへの簡単なアクセス

EC2（仮想サーバー）、S3（ストレージ）、DynamoDB（NoSQLデータベース）など、AWSのほぼすべてのサービスをサポートしています。これにより、さまざまなリソースを一元管理できます。

#### 2. 高レベルリソースインターフェース

AWSリソースを抽象化し、直感的なコードで操作できるAPIを提供します。

```py
s3.Bucket('bucket_name').upload_file('file.txt', 'destination.txt')
```

#### 3. 低レベルクライアント

詳細な操作が必要な場合、AWS APIを直接呼び出すことも可能です。

```py
# S3バケットを作成
client.create_bucket(Bucket='bucket_name')
```

#### 4. 認証情報の自動読み込み

Boto3は、AWS CLIで設定した認証情報（``~/.aws/credentials``）を自動的に読み込みます。これにより、事前の設定があれば手動で認証情報を指定する必要がありません。

#### 5. 非同期操作や並列処理

大規模な処理や一括操作に対応する便利なユーティリティも備えています。これにより、効率的なリソース管理が可能です。

## Boto3でできること
Boto3を使用することで、さまざまなAWSリソースを操作できます。以下に代表的な操作を紹介します。

:::note
**リソースの管理**

- EC2: インスタンスの起動、停止、削除
- S3: バケット作成、オブジェクトのアップロード・ダウンロード
- IAM: ユーザー作成、権限設定

**データ操作**

- DynamoDB: データの追加・取得
- SQS: メッセージキューへの送信
- SNS: 通知サービスの利用

**バックアップ・監視**

- AWS Backup: バックアップのスケジュール管理
- CloudWatch: メトリクスの取得、アラームの設定

**スケーリングや自動化**

- Lambda: 関数のデプロイや実行
- オートスケーリング: インスタンスの自動調整
:::

## 実際にやってみた
ここでは、CloudShellを使用して、以下の2つのタスクを実行してみます。

:::note warn
- **S3バケットの作成とファイルアップロード**
- **EC2インスタンスの起動**
:::

### 1. S3バケットの作成とファイルアップロード

まず、AWSコンソールからCloudShellを起動し、必要なパッケージをインストールします。

```bash
pip install boto3
```

次に、Pythonコードを作成していきます。以下のコードを ``s3_script.py``という名前で任意のディレクトリに保存してください。

```s3_script.py
import boto3
from botocore.exceptions import NoCredentialsError, PartialCredentialsError, ClientError

# AWSリージョンを設定
REGION = 'ap-northeast-1'  # 必要なリージョンを指定

# クライアントの作成
s3 = boto3.client('s3', region_name=REGION)

# バケット名（ユニークである必要があります）
bucket_name = 'honda-bucket-name-1111199999'

try:
    # バケットを作成
    s3.create_bucket(
        Bucket=bucket_name,
        CreateBucketConfiguration={
            'LocationConstraint': REGION  # リージョンを指定
        }
    )
    print(f'Bucket "{bucket_name}" created successfully.')
except ClientError as e:
    print(f'Failed to create bucket: {e}')
    exit(1)

try:
    # ファイルを作成してアップロード
    file_name = 'sample.txt'
    with open(file_name, 'w') as f:
        f.write('Hello, S3!')

    # ファイルをS3にアップロード
    s3.upload_file(file_name, bucket_name, 'uploaded_file.txt')
    print('File uploaded successfully.')
except (NoCredentialsError, PartialCredentialsError):
    print('AWS credentials not found or incomplete. Please check your configuration.')
    exit(1)
except ClientError as e:
    print(f'Failed to upload file: {e}')
    exit(1)
```

保存が完了したら、以下のコマンドでスクリプトを実行してください。

```bash
python s3_script.py
```

ターミナルに以下のような表示が出力されれば、成功です。

```bash
[cloudshell-user@ip-10-132-91-119 ~]$ python s3_script.py
Bucket "honda-bucket-name-1111199999" created successfully.
File uploaded successfully.
```

その後、AWS S3コンソールでバケットが作成され、ファイルが正常にアップロードされていることを確認できます。

![スクリーンショット 2024-11-26 20.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/996859a5-4836-8d96-280e-ad70e4ef1ce8.png)

テキストファイルが正常に作成されていることも確認できたので、Boto3の検証は大成功です。

![スクリーンショット 2024-11-26 20.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/31b20ee1-d9c6-af0f-96c8-0085c1580814.png)

### 2. EC2インスタンスの起動

次に、任意のディレクトリに``ec2_script.py``ファイルを作成し、Boto3を使ってEC2インスタンスを起動します。

```ec2_script.py
import boto3

# EC2リソースの取得
ec2_resource = boto3.resource('ec2')

# 必要な値を事前に設定
subnet_id = 'subnet-0a311eadf3e8953e2'  # 作成したサブネットID
security_group_ids = ['sg-004468d8833520ae3']  # セキュリティグループID
key_name = 'honda'  # 事前に作成したキーペア名

# インスタンスを起動
instances = ec2_resource.create_instances(
    ImageId='ami-0b6fe957a0eb4c1b9',  # 適切なAMI ID
    MinCount=1,
    MaxCount=1,
    InstanceType='t2.micro',
    SubnetId=subnet_id,  # 作成したサブネットを指定
    SecurityGroupIds=security_group_ids,  # セキュリティグループを指定
    KeyName=key_name  # 作成済みのキーペア名
)

for instance in instances:
    print(f'Instance {instance.id} created and starting.')
```

コードを保存したら、以下のコマンドでスクリプトを実行してください。

```bash
python ec2_script.py
```

ターミナルに以下のような表示が出力されれば、インスタンスが正常に起動しています。

```bash
[cloudshell-user@ip-10-132-91-119 ~]$ python ec2_script.py
Instance i-001a2b62318f64bac created and starting.
```

実際に、AWS EC2コンソールで新しいインスタンスが起動していることを確認し、正常に起動していることを確認できます。

![スクリーンショット 2024-11-26 20.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/49c8f211-4838-2e79-9dbd-28becbeb803a.png)

## まとめ
Boto3を使うことで、AWSリソースの操作をPythonコードで簡単に実現できます。

:::note
**今回のハンズオンでは、S3バケット作成、ファイルアップロード、EC2インスタンス起動を試しましたが、Boto3はバックアップや監視、自動化など様々なAWSサービスと組み合わせて運用効率を大幅に向上させます。**
:::

この技術検証が誰かの役に立てば嬉しいです！

## おまけ：Boto3の読み方と由来
Boto3の正式な読み方は「ボトスリー」または「ボトサード」です。

![スクリーンショット 2024-11-26 20.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4be5f95b-bd83-d58b-6c9a-2f062309baf2.png)
引用画像：https://medium.com/@Data-Engineer/mastering-amazon-s3-with-python-boto3-a-comprehensive-guide-b084a1138a0e

「Boto」という名前は、アマゾン川に生息するピンク色のイルカ「Boto」に由来しています。このイルカはアマゾン地域の象徴であり、AWSの名前とも関連があります。

## 参考記事

https://qiita.com/kimihiro_n/items/f3ce86472152b2676004

https://qiita.com/ymd65536/items/2ea9edc38c9693e4066a

https://blog.serverworks.co.jp/boto3-dynamodb