shell_script

shell - public cloud AWS

sysman 2021. 8. 17. 12:11

aws와 gcp 의 cli 사용환경 및 가상자원생성을 쉘 스크립트로화 하기

 

aws cli 사용 환경 만들기

 

필요정보

- aws cli 버전 2 설치 가이드 https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2-linux.html

- sudo 권한 을 가진 계정 정보

 

프로세스

1) aws cli 설치 파일 다운로드

2) unzip 이용해 다운로드 받은 설치 파일 압축 해제

3) aws/install 명령어를 이용하여 cli를 설치

4) 설치가 끝나면 aws cli 버전을 확인

 

스크립트 생성

 

[root@shell 13.Cloud-Public]# cat 13.1\ install_awscli.sh
#!/bin/bash

# curl을 사용하여 awscli 패키지 다운로드
echo "awscli download"
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

# 다운로드 받은 패키지 압축해제
echo "unzip awscliv2.zip"
unzip awscliv2.zip

# 설치 프로그램 실행
#압축 해제되면 홈디렉토리에 설치된 ./aws/install을 실행
#aws 설치 디렉토리 경로와 비이너리 위치 경로를 설정 설정, 버전확인
echo "install aws cli"
sudo ./aws/install -i /usr/local/aws-cli -b /usr/local/bin

# 설치 확인
aws --version

 

결과

...

  inflating: aws/dist/cryptography-3.3.2-py3.8.egg-info/AUTHORS.rst
  inflating: aws/dist/cryptography-3.3.2-py3.8.egg-info/RECORD
install aws cli
You can now run: /usr/local/bin/aws --version
aws-cli/2.2.29 Python/3.8.8 Linux/3.10.0-1062.el7.x86_64 exe/x86_64.centos.7 prompt/off
[root@shell 13.Cloud-Public]#

 

##################################################################################

 

aws cli 이용한 인스턴스 만들기

 

aws cli는 json 형식으로 결과를 출력

 

필요한 정보

- aws 인증 정보

- cli를 이용한 aws ec2인스턴스 생성 가이드 : https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-services-ec2-instances.html 

- 이미지 정보 조회 명령어 : aws ec2 describe-images

- 인스턴스 타입 조회 명령어 : aws ec2 instance-types

- 키페어 조회 명령어 : aws ec2 describe-key-pairs

- 보안 그룹 조회 명령어 : aws ec2 describe-security-groups

- 서브넷 조회 명령어 : aws ec2 describe-subnets

- 인스턴스 생성 명령어 : aws ec2 run-instances

 

스크립트 생성

- 보안에 안전한 셀 스크립트를 생성하기 위해서는 명령어를 실행하기 위한 파라미터값을 셀 스크립트 실행자로부터 입력 받도록 구현

- 명령어를 통해 자신의 계정에 등록된 자원 정보를 보고, 필요한 정보를 선택하여 인스턴스를 생성하는 스크립트로 개발

[root@shell 13.Cloud-Public]# cat ec2.sh
#!/bin/bash

# 인증
aws configure

# 이미지 정보 입력
read -p "Input image id : " imageid

# 인스턴스 타입 정보 입력
#json 타입으로 결과를 가져오기때문에 instance type과 t2로 시작하는 목록을 보여주고
#read명령어로 입력받음
echo "== Instance Type List =="
aws ec2 describe-instance-types | grep InstanceType | grep t2
read -p "Input instance type : " instancetype

# 키페어 정보 입력
#keypair ID 만 추출하고 그중 하나를 read -p 명령어로 입력받음
echo "== Key Pair List =="
aws ec2 describe-key-pairs | grep KeyName
read -p "Input key-pair name : " keyname

# 보안그룹 정보 입력
# describe-security-groups로 명령어 조회하고 json결과에 groupname과 groupid를 grep으로 검색
#read -p 로 securitygroup ID를 입력받음
echo "== Security Group List =="
aws ec2 describe-security-groups | grep -e GroupName -e GroupId
read -p "Input security group id : " securitygrpid

# 서브넷 정보 입력
# describe-subnets로 조회하고 subnetID와 CidrBlock 항목을 grep으로 검색
# read 명령어로 서브넷 ID를 입력받음
echo "== Subnet List =="
aws ec2 describe-subnets | grep -e SubnetId -e CidrBlock
read -p "Input subnet id : " subnetid

# EC2 인스턴스 생성
#입력받은 정보들을 이용하여 aws ec2 run-instance명령어를 이용하여 다음과 같이 인스턴스를 생성
aws ec2 run-instances \
--image-id $imageid \
--count 1 \
--instance-type $instancetype \
--key-name $keyname \
--security-group-ids $securitygrpid \
--subnet-id $subnetid

 

 

결과

[root@shell 13.Cloud-Public]# sh ec2.sh
AWS Access Key ID [****************]: key-id 입력
AWS Secret Access Key [****************]: secret key 입력
Default region name [ap-northeast-2]:
Default output format [json]:
Input image id : ami-0a0de518b1fc4524c
== Instance Type List ==
            "InstanceType": "t2.large",
            "InstanceType": "t2.2xlarge",
            "InstanceType": "t2.micro",
            "InstanceType": "t2.medium",
            "InstanceType": "t2.xlarge",
            "InstanceType": "t2.nano",
            "InstanceType": "t2.small",
Input instance type : t2.micro
== Key Pair List ==
            "KeyName": "exam-key",
            "KeyName": "stgw",
Input key-pair name : exam-key
== Security Group List ==
            "GroupName": "security-group-for-inbound-nfs-d-nurajxxugfis",
            "GroupId": "sg-01204be845",
            "GroupName": "ec2-SG",
            "GroupId": "sg-05cb65e02",
            "GroupName": "default",
            "GroupId": "sg-f0ba",
            "GroupId": "sg-f0ba98",
Input security group id : sg-05cb65e02
== Subnet List ==
            "CidrBlock": "172.31.32.0/20",
            "SubnetId": "subnet-f9a5bfb5",
            "Ipv6CidrBlockAssociationSet": [],
            "CidrBlock": "172.31.16.0/20",
            "SubnetId": "subnet-2622405d",
            "Ipv6CidrBlockAssociationSet": [],
            "CidrBlock": "172.31.48.0/20",
            "SubnetId": "subnet-3072856f",
            "Ipv6CidrBlockAssociationSet": [],
            "CidrBlock": "172.31.0.0/20",
            "SubnetId": "subnet-2dd46546",
            "Ipv6CidrBlockAssociationSet": [],
Input subnet id : subnet-f9a5bfb5
{
    "Groups": [],
    "Instances": [
        {
            "AmiLaunchIndex": 0,
            "ImageId": "ami-0a0de518b1f",
            "InstanceId": "i-0eea26bde3e4",
            "InstanceType": "t2.micro",
            "KeyName": "exam-key",
            "LaunchTime": "2021-08-17T03:47:59+00:00",
            "Monitoring": {
                "State": "disabled"
            },
            "Placement": {
                "AvailabilityZone": "ap-northeast-2c",
                "GroupName": "",
                "Tenancy": "default"
            },
            "PrivateDnsName": "ip-172-31-36-226.ap-northeast-2.compute.internal",
            "PrivateIpAddress": "172.31.36.226",
            "ProductCodes": [],
            "PublicDnsName": "",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "StateTransitionReason": "",
            "SubnetId": "subnet-f9a5",
            "VpcId": "vpc-0e0",
            "Architecture": "x86_64",
            "BlockDeviceMappings": [],
            "ClientToken": "46f5ff4f-9759-4a8e-b04",
            "EbsOptimized": false,
            "EnaSupport": true,
            "Hypervisor": "xen",
            "NetworkInterfaces": [
                {
                    "Attachment": {
                        "AttachTime": "2021-08-17T03:47:59+00:00",
                        "AttachmentId": "eni-attach-0d84383f",
                        "DeleteOnTermination": true,
                        "DeviceIndex": 0,
                        "Status": "attaching",
                        "NetworkCardIndex": 0
                    },
                    "Description": "",
                    "Groups": [
                        {
                            "GroupName": "ec2-SG",
                            "GroupId": "sg-05cb6516b"
                        }
                    ],
                    "Ipv6Addresses": [],
                    "MacAddress": "0a:46:9c:94:19:4e",
                    "NetworkInterfaceId": "eni-0ee8ec",
                    "OwnerId": "851474811695",
                    "PrivateDnsName": "ip-172-31-36-226.ap-northeast-2.compute.internal",
                    "PrivateIpAddress": "172.31.36.226",
                    "PrivateIpAddresses": [
                        {
                            "Primary": true,
                            "PrivateDnsName": "ip-172-31-36-226.ap-northeast-2.compute.internal",
                            "PrivateIpAddress": "172.31.36.226"
                        }
                    ],
                    "SourceDestCheck": true,
                    "Status": "in-use",
                    "SubnetId": "subnet-f9b5",
                    "VpcId": "vpc-0e065",
                    "InterfaceType": "interface"
                }
            ],
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SecurityGroups": [
                {
                    "GroupName": "ec2-SG",
                    "GroupId": "sg-05cb60416b"
                }
            ],
            "SourceDestCheck": true,
            "StateReason": {
                "Code": "pending",
                "Message": "pending"
            },
            "VirtualizationType": "hvm",
            "CpuOptions": {
                "CoreCount": 1,
                "ThreadsPerCore": 1
            },
            "CapacityReservationSpecification": {
                "CapacityReservationPreference": "open"
            },
            "MetadataOptions": {
                "State": "pending",
                "HttpTokens": "optional",
                "HttpPutResponseHopLimit": 1,
                "HttpEndpoint": "enabled"
            },
            "EnclaveOptions": {
                "Enabled": false
            }
        }
    ],
    "OwnerId": "851695",
    "ReservationId": "r-0892326971b"
}

 

 

서브넷은 ap-northeast-2c 으로 선택

인스턴스 생성

 

 

 

 

이슈 :

An error occurred (Unsupported) when calling the RunInstances operation: Your requested instance type (t2.micro) is not supported in your requested Availability Zone (ap-northeast-2b). Please retry your request by not specifying an Availability Zone or choosing ap-northeast-2a, ap-northeast-2c.
[root@shell 13.Cloud-Public]#

 

이런문구가 나온다면 az 존이 c인지 b인지 확인해야함. 안되면 c로 선택되어 있는 subnet을 사용해보기