boto3を動かす環境はDocker上に構築します。
Dockerfile
AWSCLI v2もいっしょに入れておきます。
FROM python:3
USER root
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
unzip \
jq \
less \
vim \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install boto3
docker-compose.yml
boto3でAWSに接続するための認証はAWSCLIのクレデンシャルを使います。
PCローカルのホームディレクトリ$HOME/.aws/credentials
にすでにアクセスキーの情報を書いてあるので、ボリュームでアタッチして共有します。Dockerの中に入ってからaws configure
で設定したり、環境変数を設定する方法もありますが、使い捨てを考えるとこの方法が楽かと思います。
version: '3'
services:
python3:
build: .
container_name: 'python3'
working_dir: '/root/'
tty: true
volumes:
- ./:/root
- $HOME/.aws/:/root/.aws/
コンテナを起動して接続
# ビルドと起動
docker-compose up -d --build
# 確認
docker-compose ps
Name Command State Ports
---------------------------------
python3 python3 Up
# 接続
docker-compose exec python3 bash
root@bbb321efbfea:~#
EC2停止のスクリプトを実行
EC2はAmazonLinux2のインスタンスを実行させていて、AmazonLinux01
というNameタグをつけています。
通常はclient.stop_instances()
にインスタンスIDを直接書いてあげればOKなのですが、今回はNameタグをもとにインスタンスIDを取得して変数に格納し、その変数を渡す方式にしてみました。
main.py
import boto3
# variables
instance_name = "AmazonLinux01"
# get instance id
client = boto3.client("ec2")
instance_id = client.describe_instances(
Filters=[{"Name": "tag:Name","Values": [instance_name]}]
)["Reservations"][0]["Instances"][0]["InstanceId"]
# stop ec2
response = client.stop_instances(
InstanceIds=[
instance_id
]
)
print(response)
実行してみると、以下のようなレスポンスが返ってきます(printされます)
# EC2停止
python main.py
{'StoppingInstances': [{'CurrentState': {'Code': 64, 'Name': 'stopping'}, 'InstanceId': 'i-00e79808cbf3f76a8', 'PreviousState': {'Code': 16, 'Name': 'running'}}], 'ResponseMetadata': {'RequestId': 'dccb6bc8-35e7-45a0-8cc4-ce8c14df7a65', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'dccb6bc8-35e7-45a0-8cc4-ce8c14df7a65', 'cache-control': 'no-cache, no-store', 'strict-transport-security': 'max-age=31536000; includeSubDomains', 'content-type': 'text/xml;charset=UTF-8', 'content-length': '579', 'date': 'Wed, 07 Apr 2021 22:14:40 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}
ちなみに、client.stop_instances()
のstop
をstart
に変えてあげればEC2を起動させることができます。