Docker에서 boto3을 사용하여 EC2 중지

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라는 이름 태그를 붙입니다.


통상은 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()stopstart 로 바꾸면 EC2를 기동시킬 수 있습니다.

참고 링크



Docker 컨테이너에서 위로 이동하는 AWS SDK에 로컬 자격 증명(~/.aws/credentials)을 로드합니다.

Boto3 Docs - client.stop_instances()

좋은 웹페이지 즐겨찾기