BOTO3
boto3는 Python용 AWS SDK이다. Boto3를 사용하면 Python 애플리케이션, 라이브러리 또는 스크립트를 Amazon S3, Amazon EC2, Amazon DynamoDB 등 AWS 서비스와 쉽게 통합할 수 있다.
boto3 api list
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html
BOTO3를 이용한 실행중인 EC2 가져오기
import boto3
client = boto3.client('ec2')
instance_tags = client.describe_instances(
Filters = [
{ 'Name': 'tag:Name',
"Values" : ['smy-svr-1'],
}
])
ids = [instance['InstanceId']
for reservation in instance_tags['Reservations']
for instance in reservation['Instances']]
print(ids)
describe_instances 를 이용하여 'smy-svr-1'이라는 이름을 가진 instance 정보를 가져올 수 있다.
Boto3를 이용해서 ec2 종료하기
import boto3
client = boto3.client('ec2')
instance_tags = client.describe_instances(
Filters = [
{ 'Name': 'tag:Name',
"Values" : ['smy-svr-1'],
}
])
ids = [instance['InstanceId']
for reservation in instance_tags['Reservations']
for instance in reservation['Instances']]
term_response = client.terminate_instances(
InstanceIds=ids)
terminate_instances 함수를 쓰면 해당 되는 instance id에 대해 instance들을 종료할 수 있다.
Boto3를 이용해서 ec2 실행하기
response = client.run_instances(
ImageId=이미지 id,
InstanceType='t2.micro',
KeyName=키페어 이름,
MaxCount=1,
MinCount=1,
SecurityGroupIds=[
보안그룹 id,
],
SubnetId=서브넷 id,
TagSpecifications=[
{
'ResourceType': 'instance',
'Tags': [
{
'Key': 'Name',
'Value': 이름
},
]
},
],
)
문서를 보면 run_instances 함수에 대해 여러개의 매개변수가 나와있다.
그 중에서 위의 매개변수들만 있으면 충분히 만들 수 있다.
만약 이름이 없어도 상관없다면 TagSpecifications를 빼도 상관없다.
TagSpecifications가 필요한 이유는 Instance의 이름을 설정해주기 위해서이다.
※ SecurityGroups로 보안그룹의 이름을 넣으면 에러가 발생하고 SecurityGroupsIds를 이용하여 보안그룹 id를 넣어야 생성이 된다.
왜 SecurityGroups는 안될까 생각해본 결과 내가 내린 답은 다음과 같다.
문서를 보면 위와 같이 나와있다.
기본 VPC에서의 security groups에 대해서만 Security Group 이름을 쓰는게 가능한 것 같다는 생각을 했다.
내가 만들때는 기본 vpc에서의 Security Groups를 이용하지 않았기 때문에 이름을 쓰는것이 불가능 한것이 아닌가라고 유추하게 되었다. (물론 아닐수도 있음)
번외) EC2 인스턴스 만들고 public ip 리턴하기
ec2를 만들고 public ip를 프린트 하도록 만들고 싶어졌다.
ec2가 만들어지고 바로 public ip가 생성되지 않는다. 초기화 후 '실행중'일때 public ip를 확인 할 수 있다.
그러므로 몇초간 기다리기 위해 time.sleep()을 쓰던지 아니면 while 무한루프를 돌면서 ip가 생성되자마다 받아오는 방법이 있을것이다.
그런데 두 방법다 내 마음에는 안들었다.
그래서 계속 찾아본 결과 다음의 방법이 있다는 것을 알게되었다.
ec2 = boto3.resource('ec2', region_name = 'ap-northeast-2')
#위의 코드와 이어지는 코드임
ec2_id = response.get('Instances')[0].get('InstanceId')
instance = ec2.Instance(id=ec2_id)
instance.wait_until_running()
instance.reload()
ip = instance.public_ip_address
1. id 값을 가져와서 EC2 instance를 나타내도록 Instance 리소스를 이용한다
2. instance의 wait_until_running()을 이용하여 running 될때까지 기다린다
3. reload()를 이용하여 다시 값을 받아온다
4. public_ip_address를 가져온다
주의해야 할것은 꼭 ec2.Instance() 코드가 필요하다. 왜냐하면 맨 밑의 3줄에 대한 함수들/속성은 모두 Instance()에 대한 함수들이기 때문이다.
cf) resource
Resources represent an object-oriented interface to Amazon Web Services (AWS). They provide a higher-level abstraction than the raw, low-level calls made by service clients.
참고
https://stackoverflow.com/questions/57585019/boto3-ec2-create-instance-with-a-name
https://dunlop.geek.nz/the-parameter-groupname-cannot-be-used-with-the-parameter-subnet/
https://stackoverflow.com/questions/46379043/boto3-wait-until-running-doesnt-work-as-desired
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2/instance/index.html