Intro

어제 boto3를 이용해 AWS S3와 로컬 파이썬 파일을 연결한 후,
오늘 AWS에 접속해보니 모르는 EC2 인스턴스가 26개가 만들어져있었다.
그것도 용량 큰 걸로..
비용적 그리고 관리적으로 매우 큰 문제이며, 이와 같은 일이 재발하지 않도록
본 문제에 대한 원인을 규명하고, 문제 발생을 방지할 수 있는 방안을 기록한다.

문제 상황

인스턴스는 버지니아 북부, 오하이오, 캘리포니아, 오레곤 4개 지역에서 생성되었다.
버지니아 북부 8개, 오하이오 6개, 캘리포니아 6개, 오레곤 6개.

인스턴스가 생성된 시각은 2023년 3월 5일 (어제) 20시 27~28분 경.
각 인스턴스는 “c5a.24xlarge”와 같이 상당히 상위 컴퓨터로 생성되었다.

문제 원인

boto3의 client() 연결시 run_instance loop에 빠질 경우 이러한 문제가 있을 수 있다.

boto3 의 client() 방식을 통한 AWS 연결시에 발생하였다.
client() 방식으로 연결시 AWS로 run_instances 를 호출하게 되는데, 일부 경우 이 run_instance를 호출하는 루프에 빠지게 된다고 한다.
이 경우 사용자의 의도와 관계 없이 EC2 인스턴스가 생성될 수 있다.

반면 resource() 방식은 client()방식과 달라 ec2가 자동 생성되는 불상사가 없다고 한다.
client() 방식은 low-level interface로 AWS API에 대한 직접적인 엑세스가 가능한 반면
resource() 방식은 high-level 객체 지향 interface로,
S3나 특정 EC2 인스턴스, DynamoDB와 같은 리소스 객체를 다루는 데 사용되기 때문이다.

때문에 boto3를 이용한 AWS 연결시에는 되도록 resource 방식을 이용하는 것을 추천한다.

추가로, client 방식에서도 ec2가 자동 생성되는 걸 막을 수 있는 코드가 있다고 한다.
이 코드를 테스트해보지는 않았으나, 향후 사용할 일이 생길 때를 대비해 기록을 남겨둔다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import boto3
from botocore.config import Config

# create a session with use_ssl and verify set to False
session = boto3.session.Session()
config = Config(
    region_name='us-east-1',
    signature_version='v4',
    retries={
        'max_attempts': 10,
        'mode': 'standard'
    },
    connect_timeout=60,
    read_timeout=60,
    parameter_validation=True,
    # set use_ssl and verify to False to prevent EC2 instance creation
    use_ssl=False,
    verify=False,
    s3={'addressing_style': 'virtual'},
)

# create an S3 client with the session and config
s3 = session.client('s3', config=config)

# your code to interact with S3 goes here