labunix's blog

labunixのラボUnix

awscliでEC2インスタンスを作成(起動)、停止、起動と停止、削除してみる。

■awscliでEC2インスタンスを作成(起動)、停止、起動と停止、削除してみる。
 本家のサイトには確認手順がない。
 リージョンやAZについて言及していないなど微妙に不親切な気がする。

$ aws --version
aws-cli/1.11.13 Python/3.5.3 Linux/4.9.0-8-amd64 botocore/1.4.70

 AWS Command Line Interface を使用して Amazon EC2 で開発環境をデプロイする
 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/tutorial-ec2-ubuntu.html

 [JAWS-UG CLI] EC2:#2 インスタンスの作成 (Public)
 https://qiita.com/tcsh/items/ae8f1f0d706237327c5a

■インスタンス作成に必要な管理者権限を持っていることを確認。
 起動する権限しか持っていなければ作成は出来ない。
 何を制限するべきか分からないうちはフルアクセスの管理者権限を使う。

$ aws iam list-groups --query 'Groups[].GroupName' --output text
Admins

■AWSアカウントの属性から、EC2-Classicに対応していないこと。
 「EC2」が表示されなければOK。

$ aws ec2 describe-account-attributes \
    --query 'AccountAttributes[?AttributeName == `supported-platforms`].AttributeValues[].AttributeValue' \
    --output text
VPC

■設定したリージョン名を確認。

$ aws configure list | awk '/region/{print $2}'
us-west-1

■リージョン内で使用可能なAZの確認。

$ aws ec2 describe-subnets --query 'Subnets[].AvailabilityZone' --output text
us-west-1b	us-west-1a

■インスタンスタイプを決める。
 以下の結果から、t2.microか、t3.microを想定する。

 awscliでAWSリージョンとAZの一覧を取得する
 http://labunix.hateblo.jp/entry/20180918/1537269823

■仮想マシンイメージとなるAMI IDを取得する必要があるので、
 過去6ヶ月分のAMIから、Amazon Linuxの最新版を1つ取得するスクリプトを書く。

$ cat myscripts/get-ami-id 
#!/bin/bash

aws ec2 describe-images \
    --owners self amazon \
    --filters \
      Name=architecture,Values=x86_64 \
      Name=state,Values=available \
      Name=name,Values=$(seq "$(date -d '6 month ago' '+%Y%m')" "$(date '+%Y%m')" | \
         awk '{a[NR]="\042amzn-ami-hvm-*"$1"*\042";if(NR>2){printf "%s,",a[(NR-1)]}}END{print a[NR]}') \
      Name=image-type,Values=machine \
      Name=owner-alias,Values=amazon \
      Name=virtualization-type,Values=hvm \
      Name=root-device-type,Values=ebs \
      Name=block-device-mapping.volume-type,Values=standard \
    --query 'Images[].[Name, ImageId]' --output text | sort | tail -1 > .amiid

cat .amiid | awk '/ami/{print $2}'

■既存のVPCに割り当てられているCIDRブロックを確認。

$ aws ec2 describe-vpcs --query 'Vpcs[].CidrBlock' --output text | sed -e 's/[1-9]/X/g'
XXX.XX.0.0/XX

■VPC IDを取得

$ aws ec2 describe-vpcs --query 'Vpcs[].VpcId' --output text | sed -e 's/[d-f0-9]/X/g'
vpc-XXXXXXXX

■VPCのCIDRは後で制限する方針として、
 新しいセキュリティグループを作成し、SSH でポート 22 を通過する着信トラフィックを許可するルールを追加する。
 リージョンのデフォルトの VPC を使用している場合は、「--vpc-id vpc-xxxxxxxx」を省略出来る。

$ aws ec2 create-security-group \
    --group-name devenv-sg \
    --description "security group for development environment" \
    --output text
$ aws ec2 authorize-security-group-ingress \
    --group-name devenv-sg \
    --protocol tcp --port 22 \
    --cidr 0.0.0.0/0

$ aws ec2 describe-security-groups --query 'SecurityGroups[].GroupName' --output text
devenv-sg	default

$ aws ec2 describe-security-groups --query 'SecurityGroups[].GroupName' --output text | \
    tr '\t' '\n' | \
    awk '{print "echo ["$1"];\134"; \
          print "aws ec2 describe-security-groups \134"; \
          print "  --filter Name=group-name,Values="$1" \134"; \
          print "  --query \047SecurityGroups[].GroupId\047 \134"; \
          print "  --output text"}' | \
     sh | sed -e 's/-......../-XXXXXXXX/' -e 's/[bc0-9]/X/g'
[devenv-sg]
sg-XXXXXXXXXdXXXXXXX
[default]
sg-XXXXXXXX

■キーペアを作成し、インスタンスに接続できるようにする。

$ aws ec2 create-key-pair --key-name devenv-key --query 'KeyMaterial' --output text > devenv-key.pem; \
  chmod 400 devenv-key.pem

■必要な情報となるAMI ID、セキュリティグループID、サブネットIDを得る。

$ get-ami-id ;cat .amiid
ami-0d7854a15957bfc0d
amzn-ami-hvm-2018.03.0.20180811-x86_64-ebs	ami-0d7854a15957bfc0d

$ get-sg-id | sed -e 's/[a-f0-9]/X/g'
sg-XXXXXXXXXXXXXXXXX

$ get-subnet-id | sed -e 's/[ac-df0-9]/X/g'
subnet-eXXXXebX

■インスタンスを起動する。

$ cat myscripts/aws-init 
#!/bin/bash

aws ec2 run-instances \
    --image-id $(get-ami-id) \
    --subnet-id $(get-subnet-id) \
    --security-group-ids $(get-sg-id) \
    --count 1 \
    --instance-type t2.micro \
    --key-name devenv-key \
    --query 'Instances[0].InstanceId' \
    --output text
cat .ami-id.log

$ aws-init
i-0485684e1e4ee6b73
ami-0d7854a15957bfc0d

$ aws ec2 describe-instances \
    --instance-ids i-0485684e1e4ee6b73 \
    --query 'Reservations[].Instances[].PublicIpAddress' --output text
54.153.103.138

$ aws ec2 describe-instances \
     --instance-ids i-0485684e1e4ee6b73 \
     --query 'Reservations[].Instances[].PublicDnsName' --output text
ec2-54-153-103-138.us-west-1.compute.amazonaws.com

■AWSコンソールで見るようなSSH接続用のシェルコマンドを生成してみる。

$ aws ec2 describe-instances \
    --filters Name=instance-state-name,Values=running | \
    jq -r '.Reservations[].Instances[] | .PublicDnsName' | awk '/aws/{print "ssh -i devenv-key.pem ec2-user@"$1}'
ssh -i devenv-key.pem ec2-user@ec2-54-153-103-138.us-west-1.compute.amazonaws.com

■起動中のインスタンスの情報を確認。

$ aws ec2 describe-instances \
    --filters Name=instance-state-name,Values=running | \
    jq -r '.Reservations[].Instances[] | .InstanceId,.ImageId,.VpcId,.SubnetId,.SecurityGroups,.PublicIpAddress,.PublicDnsName'
i-0485684e1e4ee6b73
ami-0d7854a15957bfc0d
vpc-XXXXXXXX
subnet-XXXXXXXX
[
  {
    "GroupId": "sg-XXXXXXXXXXXXXXXXX",
    "GroupName": "devenv-sg"
  }
]
54.153.103.138
ec2-54-153-103-138.us-west-1.compute.amazonaws.com

$ ssh -i devenv-key.pem ec2-user@ec2-54-153-103-138.us-west-1.compute.amazonaws.com

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
8 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.

$ exit
ログアウト
Connection to ec2-54-153-103-138.us-west-1.compute.amazonaws.com closed.

■インスタンスを停止する。

$ aws ec2 stop-instances --instance-ids=i-0485684e1e4ee6b73
{
    "StoppingInstances": [
        {
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "InstanceId": "i-0485684e1e4ee6b73",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

■使用しないインスタンスを起動、60秒後に停止する。

$ aws ec2 start-instances --instance-ids=i-0485684e1e4ee6b73;sleep 60; \
   aws ec2 stop-instances --instance-ids=i-0485684e1e4ee6b73

■インスタンスを削除する。

$ aws ec2 terminate-instances --instance-ids=i-0485684e1e4ee6b73
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-0485684e1e4ee6b73",
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            },
            "CurrentState": {
                "Code": 48,
                "Name": "terminated"
            }
        }
    ]
}

$ aws ec2 describe-instances
{
    "Reservations": []
}

$ aws ec2 describe-instance-status
{
    "InstanceStatuses": []
}