LoginSignup
3
5

More than 3 years have passed since last update.

Dockerからboto3を使ってEC2を停止する

Last updated at Posted at 2021-04-07

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タグをつけています。
image.png

通常は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}}

コンソール画面で見ると「停止済み」に変わりました。
image.png

ちなみに、client.stop_instances()stopstartに変えてあげればEC2を起動させることができます。

参考リンク

Dockerコンテナで上で動くAWS SDKにローカルの認証情報(~/.aws/credentials)を読み込ませる

Boto3 Docs - client.stop_instances()

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5