Amazon LinuxにアタッチされているEBSのボリュームサイズを拡張する。

はじめに

つい先日、Amazon EBSのアップデートで 「エラスティックボリューム」の発表 がありました。
これはEC2にアタッチされたEBSに対し、「ボリュームサイズの拡張」「パフォーマンスの調整」「ボリュームタイプの変更」がオンラインで行うことができます。
ということで今回、「ボリュームサイズの拡張」を行ってみたいと思います。

事前確認

今回作業するOSは Amazon Linux 2016.09 です。
まずは状況確認しておきます。

デバイスの確認
$ lsblk 
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0  10G  0 disk /data

現在、 xvdb という名前でボリュームサイズが10GBのデバイスがEC2インスタンスにアタッチされています。

ボリュームの確認
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         236M   60K  236M    1% /dev
tmpfs            246M     0  246M    0% /dev/shm
/dev/xvda1       7.8G  984M  6.7G   13% /
/dev/xvdb        9.8G   23M  9.2G    1% /data

また、 ファイルシステムとしても10GBのボリュームが /data 領域にマウントされているのを確認できます。

今回はこの xvdb のボリュームサイズを拡張します。

EBSサイズの拡張

[EC2] > [ボリューム] から対象となるボリュームをチェックし、[アクション]から[Modify Volume]をクリックします。
expand-ebs01.png

今回は 20GB へ拡張するので「Size」の1020に変更し[Modify]をクリックします。
expand-ebs02.png

「ボリュームの変更をしても本当にいいですか?」と聞かれるので、[Yes]をクリックします。
expand-ebs03.png

すると「in-use optimizing」というステータスになります。変更したサイズへ拡張中です。
expand-ebs04.png

しばらくして「in-use completed」になったらEBS拡張処理の完了です。
expand-ebs05.png

ファイルシステムサイズの拡張

それでは先ほど拡張したボリュームサイズがちゃんと20GBに増えているか確認してみます。

デバイスの確認
$ lsblk 
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0  20G  0 disk /data

無事、20GBのボリュームとして認識されているのが確認できました。
ですが、今のままだとEBSデバイスのサイズが増えただけです。

ボリュームの確認
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         236M   60K  236M    1% /dev
tmpfs            246M     0  246M    0% /dev/shm
/dev/xvda1       7.8G  985M  6.7G   13% /
/dev/xvdb        9.8G   23M  9.2G    1% /data

なので、まだこのままではOSから利用することはできません。
ということでOSから利用できるようにresize2fsでファイルシステムをリサイズします。

ファイルシステムの拡張
$ sudo resize2fs /dev/xvdb 
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvdb is mounted on /data; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/xvdb is now 5242880 (4k) blocks long.

これでファイルシステムのリサイズ完了です。

ボリュームの確認
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         236M   60K  236M    1% /dev
tmpfs            246M     0  246M    0% /dev/shm
/dev/xvda1       7.8G  985M  6.7G   13% /
/dev/xvdb         20G   28M   19G    1% /data

ということで無事にOSから利用できるようになりました。

おわりに

これで「とりあえず多めに確保」をする必要も無くなり、「今必要なサイズ」を割り当てれば良くなりました。
また、拡張作業もオンタイムで行えるので、費用面だけでなく運用面のコスト削減にもなります。
これで「いろんな人の負担」がかなり軽くなりますね。

続きを読む

[JAWS-UG CLI] EC2:#2 インスタンスの作成 (Public + UserData)

前提条件

EC2への権限

EC2に対してフル権限があること。

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.14
コマンド
aws --version

結果(例):

  aws-cli/1.11.19 Python/2.7.10 Darwin/15.6.0 botocore/1.4.76

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

AWSアカウントの属性

AWSアカウントがEC2-Classicに対応していないこと。

コマンド
AWS_SUPPORT_PLATFORMS=$( 
         aws ec2 describe-account-attributes 
           --query 'AccountAttributes[?AttributeName == `supported-platforms`].AttributeValues[].AttributeValue' 
           --output text 
) && echo ${AWS_SUPPORT_PLATFORMS}

結果:

  VPC

注釈: ‘VPC’の他に’EC2’が表示される場合、別のアカウントを作成もしくは
利用し てください。

0. 準備

0.1. リージョンの決定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.2. 変数の確認:

プロファイルが想定のものになっていることを確認します。

変数の確認
aws configure list

結果(例):

        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile       ec2full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
  access_key     ****************XXXX shared-credentials-file
  secret_key     ****************XXXX shared-credentials-file
      region        ap-northeast-1        env    AWS_DEFAULT_REGION

0.3. VPCの指定

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

コマンド
aws ec2 describe-vpcs 
        --query 'Vpcs[].CidrBlock'

結果(例):

  [
    "172.31.0.0/16",
    "10.192.0.0/16"
  ]

ここでは、10.192.0.0/16を範囲とするVPCを選択します。

変数の設定
VPC_CIDR='10.192.0.0/16'

VPC IDを取得します。

コマンド
VPC_ID=$( 
        aws ec2 describe-vpcs 
          --filters Name=cidr,Values=${VPC_CIDR} 
          --query 'Vpcs[].VpcId' 
          --output text 
) 
        && echo ${VPC_ID}

結果(例):

  vpc-xxxxxxxx

0.4. サブネットの指定

変数の設定
VPC_SUBNET_CIDR='10.192.0.0/24'
コマンド
VPC_SUBNET_ID=$( 
        aws ec2 describe-subnets 
          --filters Name=cidrBlock,Values=${VPC_SUBNET_CIDR} 
          --query 'Subnets[].SubnetId' 
          --output text 
) 
        && echo ${VPC_SUBNET_ID}

結果(例):

  subnet-xxxxxxxx

0.5. UserDataの指定

変数の設定
FILE_EC2_USERDATA='userdata.bash'

1. 事前作業

1.1. プライベートアドレスの決定

選択したサブネットのアドレス範囲内で、起動するインスタンスのプライベー
トIPアドレスを指定します。

変数の設定
EC2_PRIVATE_ADDR='10.192.0.8'

1.2. セキュリティグループの決定

セキュリティグループの一覧を確認します。

コマンド
aws ec2 describe-security-groups 
        --query "SecurityGroups[?VpcId == ` ${VPC_ID}`].GroupName"

結果(例):

  [
    "default",
    "ec2-ssh-global-inbound"
  ]

利用するセキュリティグループ名を指定します。

変数の設定
VPC_SG_NAME='ec2-ssh-global-inbound'
コマンド
VPC_SG_ID=$( 
        aws ec2 describe-security-groups 
          --filter Name=group-name,Values=${VPC_SG_NAME} 
          --query "SecurityGroups[?VpcId == ` ${VPC_ID}`].GroupId" 
          --output text 
) 
        && echo ${VPC_SG_ID}

結果(例):

  sg-xxxxxxxx

セキュリティグループを配列に入れておきます。

変数の設定
ARRAY_VPC_SG_ID="${VPC_SG_ID} ${ARRAY_VPC_SG_ID}" 
        && echo ${ARRAY_VPC_SG_ID}

1.3. キーペアの指定

まず、キーペアの一覧を確認します。

コマンド
aws ec2 describe-key-pairs 
        --query 'KeyPairs[].KeyName'

結果(例):

  [
      "<キーペアー名>"
  ]

利用するキーペア名を指定します。

変数の設定
EC2_KEY_PAIR_NAME='<キーペアー名>'

利用するキーペアの秘密鍵ファイルを指定します。

変数の設定
FILE_SSH_KEY="${HOME}/.ssh/<キーペア秘密鍵のファイル名>" 
        && echo ${FILE_SSH_KEY}

秘密鍵が存在することを確認しましょう。

コマンド
ls ${FILE_SSH_KEY}

1.4. イメージIDの決定

AMIを選択します。

変数の設定
AMZLINUX_VERSION='2016.03.3'
EC2_IMAGE_NAME="amzn-ami-hvm-${AMZLINUX_VERSION}.x86_64-gp2"
コマンド
EC2_IMAGE_ID=$( 
        aws ec2 describe-images 
          --filters Name=name,Values="${EC2_IMAGE_NAME}" 
          --query 'Images[].ImageId' --output text 
) 
        && echo ${EC2_IMAGE_ID}

結果(例):

  ami-XXXXXXXX

1.5. インスタンスタイプの決定

変数の設定
EC2_INSTANCE_TYPE='t2.micro'

1.6. 稼動インスタンスを確認

同一リージョンでインスタンスが起動していないことを確認します。

コマンド
EC2_INSTANCE_STATUS='running'
コマンド
aws ec2 describe-instances 
        --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS}

結果:

  {
      "Reservations": []
  }

2. インスタンス起動

2.1. インスタンス起動

変数の確認
cat << ETX

        EC2_IMAGE_ID:              ${EC2_IMAGE_ID}
        EC2_INSTANCE_TYPE:         ${EC2_INSTANCE_TYPE}
        EC2_KEY_PAIR_NAME:         ${EC2_KEY_PAIR_NAME}
        EC2_PRIVATE_ADDR:          ${EC2_PRIVATE_ADDR}
        ARRAY_VPC_SG_ID:           ${ARRAY_VPC_SG_ID}
        VPC_SUBNET_ID              ${VPC_SUBNET_ID}
        FILE_EC2_USERDATA:         ${FILE_EC2_USERDATA}

ETX
コマンド
aws ec2 run-instances 
        --image-id ${EC2_IMAGE_ID} 
        --instance-type ${EC2_INSTANCE_TYPE} 
        --security-group-ids ${ARRAY_VPC_SG_ID} 
        --key-name ${EC2_KEY_PAIR_NAME} 
        --subnet-id ${VPC_SUBNET_ID} 
        --private-ip-address ${EC2_PRIVATE_ADDR} 
        --associate-public-ip-address  
        --user-data file://${FILE_EC2_USERDATA}

結果(例):

  {
    "OwnerId": "XXXXXXXXXXXX",
    "ReservationId": "r-xxxxxxxxxxxxxxxxx",
    "Groups": [],
    "Instances": [
      {
          "Monitoring": {
              "State": "disabled"
          },
          "PublicDnsName": "",
          "RootDeviceType": "ebs",
          "State": {
              "Code": 0,
              "Name": "pending"
          },
          "EbsOptimized": false,
          "LaunchTime": "2016-12-05T01:23:45.000Z",
          "PrivateIpAddress": "10.192.0.8",
          "ProductCodes": [],
          "VpcId": "vpc-xxxxxxxx",
          "StateTransitionReason": "",
          "InstanceId": "i-xxxxxxxxxxxxxxxxx",
          "ImageId": "ami-xxxxxxxx",
          "PrivateDnsName": "ip-xxx-xxx-xxx-xxx.ap-northeast-1ap-northeast-1.compute.internal",
          "KeyName": "<キーペアー名>",
          "SecurityGroups": [
              {
                  "GroupName": "ec2-ssh-global-inbound",
                  "GroupId": "sg-xxxxxxxx"
              }
          ],
          "ClientToken": "",
          "SubnetId": "subnet-xxxxxxxx",
          "InstanceType": "t2.micro",
          "NetworkInterfaces": [
              {
                  "Status": "in-use",
                  "MacAddress": "xx:xx:xx:xx:xx:xx",
                  "SourceDestCheck": true,
                  "VpcId": "vpc-xxxxxxxx",
                  "Description": "",
                  "NetworkInterfaceId": "eni-xxxxxxxx",
                  "PrivateIpAddresses": [
                      {
                          "Primary": true,
                          "PrivateIpAddress": "10.192.0.8"
                      }
                  ],
                  "Attachment": {
                      "Status": "attaching",
                      "DeviceIndex": 0,
                      "DeleteOnTermination": true,
                      "AttachmentId": "eni-attach-xxxxxxxx",
                      "AttachTime": "2016-12-05T01:23:45.000Z"
                  },
                  "Groups": [
                      {
                          "GroupName": "<キーペアー名>",
                          "GroupId": "sg-xxxxxxxx"
                      }
                  ],
                  "SubnetId": "subnet-xxxxxxxx",
                  "OwnerId": "XXXXXXXXXXXX",
                  "PrivateIpAddress": "10.192.0.8"
              }
          ],
          "SourceDestCheck": true,
          "Placement": {
              "Tenancy": "default",
              "GroupName": "",
              "AvailabilityZone": "ap-northeast-1a"
          },
          "Hypervisor": "xen",
          "BlockDeviceMappings": [],
          "Architecture": "x86_64",
          "StateReason": {
              "Message": "pending",
              "Code": "pending"
          },
          "RootDeviceName": "/dev/xvda",
          "VirtualizationType": "hvm",
          "AmiLaunchIndex": 0
      }
    ]
  }

2.2. インスタンスIDの取得

起動中のインスタンスからインスタンスIDを取得します。

コマンド
EC2_INSTANCE_ID=$( 
        aws ec2 describe-instances 
          --filters Name=private-ip-address,Values=${EC2_PRIVATE_ADDR} 
          --query 'Reservations[].Instances[].InstanceId' 
          --output text 
) 
        && echo ${EC2_INSTANCE_ID}

結果(例):

  i-xxxxxxxxxxxxxxxxx

3. 事後作業

3.1 インスタンスのステータス確認

コマンド
EC2_INSTANCE_STATE=$( 
        aws ec2 describe-instances 
        --instance-ids ${EC2_INSTANCE_ID} 
        --query 'Reservations[].Instances[].State.Name' 
        --output text 
) 
        && echo ${EC2_INSTANCE_STATE}

結果(例):

  running

3.2. パブリックIPアドレスの取得

コマンド
EC2_PUBLIC_IP=$( 
        aws ec2 describe-instances 
          --instance-id ${EC2_INSTANCE_ID} 
          --query "Reservations[].Instances[].PublicIpAddress" 
          --output text 
) 
        && echo ${EC2_PUBLIC_IP}

結果(例):

  xxx.xxx.xxx.xxx

4. インスタンスへのログイン

4.1. SSHログイン

変数の確認
cat << ETX

        FILE_SSH_KEY:  ${FILE_SSH_KEY}
        EC2_PUBLIC_IP: ${EC2_PUBLIC_IP}

ETX
コマンド
ssh -i ${FILE_SSH_KEY} ec2-user@${EC2_PUBLIC_IP}

結果(例):

  The authenticity of host '54.xxx.xxx.xxx (54.xxx.xxx.xxx)' can't be established.
  RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
  Are you sure you want to continue connecting (yes/no)?

入力:

  yes

結果(例):

  Warning: Permanently added '54.xxx.xxx.xxx' (RSA) to the list of known hosts.

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

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

4.2. パッケージ更新

コマンド
sudo yum update -y

4.3. EC2メタ情報の確認

コマンド(EC2インスタンス)
echo -e "n"   && curl http://169.254.169.254/latest/meta-data/public-ipv4   && echo -e "n"

結果(例):

  xxx.xxx.xxx.xxx

4.4. EC2インスタンスからログアウト

コマンド(EC2インスタンス)
exit

完了

続きを読む

オンラインでEC2のルートディスクを拡張する

@ryo0301さんにEBSがオンラインで拡張できるよって教えてもらったので、試してみました。

AWSコンソールからディスクサイズを拡張

EBSのVolumesからModify Volumeを選んで拡張できます。
なんとVolume Typeも変えられるみたいです。
今回はそこは不要なので、Sizeだけ8Gから500Gに変更しました。
(増やしたら減らせません。)

modifyvolume.png

optimizingになればもうresize2fs可能なようです。数秒でoptimizingになりました。
completedまでは5〜10分程度でした。

resize2fs

ディスクの状態を確認します。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs         2014036      56   2013980   1% /dev
tmpfs            2024908       0   2024908   0% /dev/shm
/dev/xvda1       8123812 2962092   5061472  37% /

$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  500G  0 disk
└─xvda1 202:1    0    8G  0 part /

実行します。

$ sudo resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
The filesystem is already 2096635 (4k) blocks long.  Nothing to do!

Nothing to do!

できませんでした。
調べたら、こんな記事を発見したので、参考にさせてもらって実行します。
EC2のCentOS6 HVMでresize2fs “Nothing to do!”と言われたとき

growpart & resize2fs

growpartしたあとにresize2fsすればいいようなのでやってみます。

まずはgrowpartです。

$ sudo growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=16773086,end=16777182 new: size=1048571870,end=1048575966

もちろんまだ増えてません。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs         2014036      56   2013980   1% /dev
tmpfs            2024908       0   2024908   0% /dev/shm
/dev/xvda1       8123812 2962092   5061472  37% /

resize2fsを実行して

$ sudo resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 32
The filesystem on /dev/xvda1 is now 131071483 (4k) blocks long.

増えました。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs         2014036      56   2013980   1% /dev
tmpfs            2024908       0   2024908   0% /dev/shm
/dev/xvda1     515928484 2978256 512849980   1% /

$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  500G  0 disk
└─xvda1 202:1    0  500G  0 part /

無事500Gになりました。

続きを読む

オンラインでボリュームや性能追加できるAmazon EBSのElastic Volume

利用はAWSマネジメントコンソールやAPIコール、AWS CLIから行なえる。AWS CloudFormationのスタック更新機能も利用でき、対象のボリュームに必要な変更 … 続きを読む

Elastic Volumes (Amazon EBS)

ついにEC2インスタンスを起動したままEBSのボリュームタイプと容量・IOPSの変更ができるようになりました!

Elastic Volumes(エラスティックボリューム)という機能だそうです。
新しいボリュームタイプではないのですね。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/considerations.html
を見ると
– Magneticは対象外
– サイズ縮小は当然NG
– 変更後は6時間変更不可
– 2016/11/1以前にアタッチされたボリュームはインスタンスの停止・起動、またはボリュームのデタッチ・アタッチが必要
らしい。他にも制約や前提ありますね。読み込まないと。

紹介記事

続きを読む

[JAWS-UG CLI] EC2 # インスタンスの作成 (Public: Redmine AMI)

前提条件

EC2への権限

EC2に対してフル権限があること。

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.14
コマンド
aws --version

結果(例):

  aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

AWSアカウントの属性

AWSアカウントがEC2-Classicに対応していないこと。

コマンド
AWS_SUPPORT_PLATFORMS=$( 
         aws ec2 describe-account-attributes 
           --query 'AccountAttributes[?AttributeName == `supported-platforms`].AttributeValues[].AttributeValue' 
           --output text 
) 
        && echo ${AWS_SUPPORT_PLATFORMS}

結果:

  VPC

注釈: ‘VPC’の他に’EC2’が表示される場合、別のアカウントを作成もしくは
利用し てください。

0. 準備

0.1. リージョンの決定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.2. プロファイルの確認

プロファイルが想定のものになっていることを確認します。

変数の確認
aws configure list

結果(例):

        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile       ec2full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
  access_key     ****************XXXX shared-credentials-file
  secret_key     ****************XXXX shared-credentials-file
      region        ap-northeast-1        env    AWS_DEFAULT_REGION

0.3. VPCの指定

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

コマンド
aws ec2 describe-vpcs 
        --query 'Vpcs[].CidrBlock'

結果(例):

  [
    "172.31.0.0/16",
    "172.18.0.0/16"
  ]

ここでは、172.18.0.0/16を範囲とするVPCを選択します。

変数の設定
VPC_CIDR='172.18.0.0/16'

VPC IDを取得します。

コマンド
VPC_ID=$( 
        aws ec2 describe-vpcs 
          --filters Name=cidr,Values=${VPC_CIDR} 
          --query 'Vpcs[].VpcId' 
          --output text 
) 
        && echo ${VPC_ID}

結果(例):

  vpc-xxxxxxxx

0.4. サブネットの指定

変数の設定
VPC_SUBNET_CIDR='172.18.16.0/24'
コマンド
VPC_SUBNET_ID=$( 
        aws ec2 describe-subnets 
          --filters Name=cidrBlock,Values=${VPC_SUBNET_CIDR} 
          --query 'Subnets[].SubnetId' 
          --output text 
) 
        && echo ${VPC_SUBNET_ID}

結果(例):

  subnet-xxxxxxxx

1. 事前作業

1.1. セキュリティグループの決定

セキュリティグループの一覧を確認します。

コマンド
aws ec2 describe-security-groups 
        --query "SecurityGroups[?VpcId == ` ${VPC_ID}`].GroupName"

結果(例):

  [
    "default",
    "ec2-ssh-global-inbound"
  ]

対象となるセキュリティグループ名を指定します。

変数の設定
VPC_SG_NAME='ec2-ssh-global-inbound'

セキュリティグループIDを取得します。

コマンド
VPC_SG_ID=$( 
        aws ec2 describe-security-groups 
          --filter Name=group-name,Values=${VPC_SG_NAME} 
          --query "SecurityGroups[?VpcId == ` ${VPC_ID}`].GroupId" 
          --output text 
) 
        && echo ${VPC_SG_ID}

結果(例):

  sg-xxxxxxxx

セキュリティグループの内容を確認しましょう。

コマンド
aws ec2 describe-security-groups 
        --group-ids ${VPC_SG_ID}

セキュリティグループを配列に入れておきます。

変数の設定
ARRAY_VPC_SG_IDS="${VPC_SG_ID}" 
        && echo ${ARRAY_VPC_SG_IDS}

1.2. イメージIDの決定

AMIを選択します。

変数の設定
EC2_IMAGE_NAME='redmine-prototype-20170213'
コマンド
EC2_IMAGE_ID=$( 
        aws ec2 describe-images 
          --filters Name=name,Values="${EC2_IMAGE_NAME}" 
          --query 'Images[].ImageId' 
          --output text 
) 
        && echo ${EC2_IMAGE_ID}

結果(例):

  ami-XXXXXXXX

1.3. インスタンスタイプの決定

変数の設定
EC2_INSTANCE_TYPE='t2.micro'

1.4. 稼動インスタンスを確認

同一でインスタンスが起動していないことを確認します。

コマンド
EC2_INSTANCE_STATUS='running'
コマンド
aws ec2 describe-instances 
        --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS}

結果:

  {
    "Reservations": []
  }

2. インスタンス起動

2.1. インスタンス起動

変数の確認
cat << ETX

        EC2_IMAGE_ID:              ${EC2_IMAGE_ID}
        EC2_INSTANCE_TYPE:         ${EC2_INSTANCE_TYPE}
        ARRAY_VPC_SG_IDS:          ${ARRAY_VPC_SG_IDS}
        VPC_SUBNET_ID              ${VPC_SUBNET_ID}

ETX

コマンド

  aws ec2 run-instances 
    --image-id ${EC2_IMAGE_ID} 
    --instance-type ${EC2_INSTANCE_TYPE} 
    --security-group-ids ${ARRAY_VPC_SG_IDS} 
    --subnet-id ${VPC_SUBNET_ID} 
    --associate-public-ip-address

結果(例):

  {
    "OwnerId": "XXXXXXXXXXXX",
    "ReservationId": "r-0175dfcc93e29ff43",
    "Groups": [],
    "Instances": [
      {
          "Monitoring": {
              "State": "disabled"
          },
          "PublicDnsName": "",
          "RootDeviceType": "ebs",
          "State": {
              "Code": 0,
              "Name": "pending"
          },
          "EbsOptimized": false,
          "LaunchTime": "2017-02-13T01:23:45.000Z",
          "PrivateIpAddress": "xxx.xxx.xxx.xxx",
          "ProductCodes": [],
          "VpcId": "vpc-xxxxxxxx",
          "StateTransitionReason": "",
          "InstanceId": "i-xxxxxxxxxxxxxxxxx",
          "ImageId": "ami-00c08367",
          "PrivateDnsName": "ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal",
          "SecurityGroups": [
              {
                  "GroupName": "ec2-ssh-global-inbound",
                  "GroupId": "sg-xxxxxxxx"
              }
          ],
          "ClientToken": "",
          "SubnetId": "subnet-xxxxxxxx",
          "InstanceType": "t2.micro",
          "NetworkInterfaces": [
              {
                  "Status": "in-use",
                  "MacAddress": "xx:xx:xx:xx:xx:xx",
                  "SourceDestCheck": true,
                  "VpcId": "vpc-xxxxxxxx",
                  "Description": "",
                  "NetworkInterfaceId": "eni-xxxxxxxx",
                  "PrivateIpAddresses": [
                      {
                          "Primary": true,
                          "PrivateIpAddress": "xxx.xxx.xxx.xxx"
                      }
                  ],
                  "Ipv6Addresses": [],
                  "Attachment": {
                      "Status": "attaching",
                      "DeviceIndex": 0,
                      "DeleteOnTermination": true,
                      "AttachmentId": "eni-attach-xxxxxxxx",
                      "AttachTime": "2017-02-13T01:23:45.000Z"
                  },
                  "Groups": [
                      {
                          "GroupName": "ec2-ssh-global-inbound",
                          "GroupId": "sg-xxxxxxxx"
                      }
                  ],
                  "SubnetId": "subnet-xxxxxxxx",
                  "OwnerId": "XXXXXXXXXXXX",
                  "PrivateIpAddress": "xxx.xxx.xxx.xxx"
              }
          ],
          "SourceDestCheck": true,
          "Placement": {
              "Tenancy": "default",
              "GroupName": "",
              "AvailabilityZone": "ap-northeast-1a"
          },
          "Hypervisor": "xen",
          "BlockDeviceMappings": [],
          "Architecture": "x86_64",
          "StateReason": {
              "Message": "pending",
              "Code": "pending"
          },
          "RootDeviceName": "/dev/xvda",
          "VirtualizationType": "hvm",
          "AmiLaunchIndex": 0
      }
    ]
  }

2.2. インスタンスIDの取得

起動中のインスタンスからインスタンスIDを取得します。

変数の設定
EC2_INSTANCE_STATUS='pending'
コマンド
ARRAY_EC2_INSTANCE_ID=$( 
        aws ec2 describe-instances 
          --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS} 
          --query 'Reservations[].Instances[].InstanceId' 
          --output text 
) 
        && echo ${ARRAY_EC2_INSTANCE_ID}

結果(例):

  i-xxxxxxxx
変数の設定
EC2_INSTANCE_ID="${ARRAY_EC2_INSTANCE_ID}" 
        && echo ${EC2_INSTANCE_ID}

3. 事後作業

インスタンスのステータス確認

コマンド
EC2_INSTANCE_STATE=$( 
        aws ec2 describe-instances 
        --instance-ids ${EC2_INSTANCE_ID} 
        --query 'Reservations[].Instances[].State.Name' 
        --output text 
) 
        && echo ${EC2_INSTANCE_STATE}

結果(例):

  running
コマンド
EC2_PUBLIC_IP=$( 
        aws ec2 describe-instances 
          --instance-id ${EC2_INSTANCE_ID} 
          --query "Reservations[].Instances[].PublicIpAddress" 
          --output text 
) 
        && echo ${EC2_PUBLIC_IP}

結果(例):

  xxx.xxx.xxx.xxx

完了

続きを読む

[JAWS-UG CLI] EC2 # AMI作成

前提条件

EC2への権限

EC2に対してフル権限があること。

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.34
コマンド
aws --version

結果(例):

  aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

0. 準備

0.1. リージョンの決定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.2. プロファイルの確認

プロファイルが想定のものになっていることを確認します。

変数の確認
aws configure list

結果(例):

        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile       ec2as_full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
  access_key     ****************XXXX shared-credentials-file
  secret_key     ****************XXXX shared-credentials-file
      region        ap-northeast-1        env    AWS_DEFAULT_REGION

0.3. インスタンスIDの指定

既存のインスタンスに割り当てられているIPアドレスを確認します。

ここでは、10.192.0.22を割り当てられているインスタンスを選択します。

変数の設定
EC2_PRIVATE_ADDR='10.192.0.22'

インスタンスIDを取得します。

コマンド
EC2_INSTANCE_ID=$( 
        aws ec2 describe-instances 
          --filters Name=private-ip-address,Values=${EC2_PRIVATE_ADDR} 
          --query 'Reservations[].Instances[].InstanceId' 
          --output text 
) 
        && echo ${EC2_INSTANCE_ID}

結果(例):

  i-xxxxxxxxxxxxxxxxx

1. 事前作業

1.2. イメージ名の決定

変数の設定
EC2_IMAGE_NAME="redmine-prototype-$( date +%Y%m%d )" 
        && echo ${EC2_IMAGE_NAME}

同名のイメージの不存在確認

コマンド
aws ec2 describe-images 
        --filter "Name=name, Values=${EC2_IMAGE_NAME}"

結果(例):

  {
    "Images": []
  }
変数の設定
EC2_IMAGE_DESC='Redmine Image (Prototype)'

2. AMIの作成

2.1. 対象インスタンスのステータス確認

コマンド
EC2_INSTANCE_STATE=$( 
        aws ec2 describe-instances 
        --instance-ids ${EC2_INSTANCE_ID} 
        --query 'Reservations[].Instances[].State.Name' 
        --output text 
) 
        && echo ${EC2_INSTANCE_STATE}

結果(例):

  running

2.2. AMIの作成

変数の確認
cat << ETX

        EC2_INSTANCE_ID:  ${EC2_INSTANCE_ID}
        EC2_IMAGE_NAME:   ${EC2_IMAGE_NAME}
        EC2_IMAGE_DESC:  "${EC2_IMAGE_DESC}"

ETX
コマンド
aws ec2 create-image 
        --instance-id ${EC2_INSTANCE_ID} 
        --name ${EC2_IMAGE_NAME} 
        --description "${EC2_IMAGE_DESC}"

結果(例):

  {
    "ImageId": "ami-xxxxxxxx"
  }

インスタンスがリブートを開始します。

3. 事後作業

3.1. 対象インスタンスのステータス確認

コマンド
EC2_INSTANCE_STATE=$( 
        aws ec2 describe-instances 
        --instance-ids ${EC2_INSTANCE_ID} 
        --query 'Reservations[].Instances[].State.Name' 
        --output text 
) 
        && echo ${EC2_INSTANCE_STATE}

結果(例):

  running

イメージ情報が表示されるまで数分かかります。

3.2. AMIのステータス確認

コマンド
EC2_IMAGE_STATE=$( 
        aws ec2 describe-images 
          --filters Name=name,Values="${EC2_IMAGE_NAME}" 
          --query "Images[?Name == `${EC2_IMAGE_NAME}`].State" 
          --output text 
) 
        && echo ${EC2_IMAGE_STATE}

結果(例):

  available

availableになれば作成は完了しています。

AMIの確認

コマンド
aws ec2 describe-images 
        --filter "Name=name, Values=${EC2_IMAGE_NAME}"

結果(例):

  {
    "Images": [
      {
          "VirtualizationType": "hvm",
          "Name": "redmine-prototype-20170131",
          "Hypervisor": "xen",
          "EnaSupport": true,
          "SriovNetSupport": "simple",
          "ImageId": "ami-xxxxxxxx",
          "State": "available",
          "BlockDeviceMappings": [
              {
                  "DeviceName": "/dev/xvda",
                  "Ebs": {
                      "DeleteOnTermination": true,
                      "SnapshotId": "snap-xxxxxxxx",
                      "VolumeSize": 8,
                      "VolumeType": "gp2",
                      "Encrypted": false
                  }
              }
          ],
          "Architecture": "x86_64",
          "ImageLocation": "XXXXXXXXXXXX/redmine-prototype-20170131",
          "RootDeviceType": "ebs",
          "OwnerId": "XXXXXXXXXXXX",
          "RootDeviceName": "/dev/xvda",
          "CreationDate": "2017-02-13T01:23:45.000Z",
          "Public": false,
          "ImageType": "machine",
          "Description": "Redmine Image (Prototype)"
      }
    ]
  }

完了

続きを読む

[JAWS-UG CLI] EC2 # インスタンスの作成 (Public: Redmine)

前提条件

EC2への権限

EC2に対してフル権限があること。

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.14
コマンド
aws --version

結果(例):

  aws-cli/1.11.34 Python/2.7.10 Darwin/15.6.0 botocore/1.4.91

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

AWSアカウントの属性

AWSアカウントがEC2-Classicに対応していないこと。

コマンド
AWS_SUPPORT_PLATFORMS=$( 
         aws ec2 describe-account-attributes 
           --query 'AccountAttributes[?AttributeName == `supported-platforms`].AttributeValues[].AttributeValue' 
           --output text 
) 
        && echo ${AWS_SUPPORT_PLATFORMS}

結果:

  VPC

注釈: ‘VPC’の他に’EC2’が表示される場合、別のアカウントを作成もしくは
利用し てください。

0. 準備

0.1. リージョンの決定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.2. プロファイルの確認

プロファイルが想定のものになっていることを確認します。

変数の確認
aws configure list

結果(例):

        Name                    Value             Type    Location
        ----                    -----             ----    --------
     profile       ec2full-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
  access_key     ****************XXXX shared-credentials-file
  secret_key     ****************XXXX shared-credentials-file
      region        ap-northeast-1        env    AWS_DEFAULT_REGION

0.3. VPCの指定

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

コマンド
aws ec2 describe-vpcs 
        --query 'Vpcs[].CidrBlock'

結果(例):

  [
    "172.31.0.0/16",
    "10.192.0.0/16"
  ]

ここでは、10.192.0.0/16を範囲とするVPCを選択します。

変数の設定
VPC_CIDR='10.192.0.0/16'

VPC IDを取得します。

コマンド
VPC_ID=$( 
        aws ec2 describe-vpcs 
          --filters Name=cidr,Values=${VPC_CIDR} 
          --query 'Vpcs[].VpcId' 
          --output text 
) 
        && echo ${VPC_ID}

結果(例):

  vpc-xxxxxxxx

0.4. サブネットの指定

変数の設定
VPC_SUBNET_CIDR='10.192.0.0/24'
コマンド
VPC_SUBNET_ID=$( 
        aws ec2 describe-subnets 
          --filters Name=cidrBlock,Values=${VPC_SUBNET_CIDR} 
          --query 'Subnets[].SubnetId' 
          --output text 
) 
        && echo ${VPC_SUBNET_ID}

結果(例):

  subnet-xxxxxxxx

0.5. UserDataの指定

変数の設定
FILE_INPUT='config-ec2-handson-20170213/userdata.bash' 
        && cat ${FILE_INPUT}

0.6. インスタンスプロファイルの指定

変数の設定
IAM_INSTANCE_PROFILE_NAME='EC2InstanceProfile_EnvAMI'
コマンド
aws iam get-instance-profile 
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME}

結果(例):

  {
    "InstanceProfiles": [
      {
          "InstanceProfileId": "AIPAJRUJIZXNNQU4R6VZM",
          "Roles": [
              {
                  "AssumeRolePolicyDocument": {
                      "Version": "2012-10-17",
                      "Statement": [
                          {
                              "Action": "sts:AssumeRole",
                              "Principal": {
                                  "Service": "ec2.amazonaws.com"
                              },
                              "Effect": "Allow",
                              "Sid": ""
                          }
                      ]
                  },
                  "RoleId": "AROAXXXXXXXXXXXXXXXXX",
                  "CreateDate": "2017-02-13T01:23:45Z",
                  "RoleName": "EC2InstanceProfile_EnvAMI_Role",
                  "Path": "/",
                  "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/EC2InstanceProfile_EnvAMI_Role"
              }
          ],
          "CreateDate": "2017-02-13T01:23:45Z",
          "InstanceProfileName": "EC2InstanceProfile_EnvAMI",
          "Path": "/",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/EC2InstanceProfile_EnvAMI"
      }
    ]
  }

1. 事前作業

1.1. プライベートアドレスの決定

選択したサブネットのアドレス範囲内で、起動するインスタンスのプライベー
トIPアドレスを指定します。

変数の設定
EC2_PRIVATE_ADDR='10.192.0.22'

1.2. セキュリティグループの決定

セキュリティグループの一覧を確認します。

コマンド
aws ec2 describe-security-groups 
        --query "SecurityGroups[?VpcId == ` ${VPC_ID}`].GroupName"

結果(例):

  [
    "default",
    "EnvMaintAMI"
  ]

対象となるセキュリティグループ名を指定します。

変数の設定
VPC_SG_NAME='EnvMaintAMI'

セキュリティグループIDを取得します。

コマンド
VPC_SG_ID=$( 
        aws ec2 describe-security-groups 
          --filter Name=group-name,Values=${VPC_SG_NAME} 
          --query "SecurityGroups[?VpcId == ` ${VPC_ID}`].GroupId" 
          --output text 
) 
        && echo ${VPC_SG_ID}

結果(例):

  sg-xxxxxxxx

セキュリティグループの内容を確認しましょう。

コマンド
aws ec2 describe-security-groups 
        --group-ids ${VPC_SG_ID}

セキュリティグループを配列に入れておきます。

変数の設定
ARRAY_VPC_SG_IDS="${VPC_SG_ID}" 
        && echo ${ARRAY_VPC_SG_IDS}

1.3. キーペアの指定

まず、キーペアの一覧を確認します。

コマンド
aws ec2 describe-key-pairs 
        --query 'KeyPairs[].KeyName'

結果(例):

  [
      "<キーペアー名>"
  ]

利用するキーペア名を指定します。

変数の設定
EC2_KEY_PAIR_NAME='<キーペアー名>'

利用するキーペアの秘密鍵ファイルを指定します。

変数の設定
FILE_SSH_KEY="${HOME}/.ssh/<キーペア秘密鍵のファイル名>" 
        echo ${FILE_SSH_KEY}

秘密鍵が存在することを確認しましょう。

コマンド
ls ${FILE_SSH_KEY}

1.4. イメージIDの決定

AMIを選択します。

変数の設定
AMZLINUX_VERSION='2016.03.3'
EC2_IMAGE_NAME="amzn-ami-hvm-${AMZLINUX_VERSION}.x86_64-gp2"
コマンド
EC2_IMAGE_ID=$( 
        aws ec2 describe-images 
          --filters Name=name,Values="${EC2_IMAGE_NAME}" 
          --query 'Images[].ImageId' 
          --output text 
) 
        && echo ${EC2_IMAGE_ID}

結果(例):

  ami-XXXXXXXX

1.5. インスタンスタイプの決定

変数の設定
EC2_INSTANCE_TYPE='t2.micro'

1.6. 稼動インスタンスを確認

同一リージョンでインスタンスが起動していないことを確認します。

コマンド
EC2_INSTANCE_STATUS='running'
コマンド
aws ec2 describe-instances 
        --filters Name=instance-state-name,Values=${EC2_INSTANCE_STATUS}

結果:

  {
    "Reservations": []
  }

2. インスタンス起動

2.1. インスタンス起動

変数の確認
cat << ETX

        EC2_IMAGE_ID:              ${EC2_IMAGE_ID}
        EC2_INSTANCE_TYPE:         ${EC2_INSTANCE_TYPE}
        EC2_KEY_PAIR_NAME:         ${EC2_KEY_PAIR_NAME}
        EC2_PRIVATE_ADDR:          ${EC2_PRIVATE_ADDR}
        ARRAY_VPC_SG_IDS:          ${ARRAY_VPC_SG_IDS}
        VPC_SUBNET_ID              ${VPC_SUBNET_ID}
        FILE_INPUT:                ${FILE_INPUT}
        IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}

ETX

コマンド

  aws ec2 run-instances 
    --image-id ${EC2_IMAGE_ID} 
    --instance-type ${EC2_INSTANCE_TYPE} 
    --security-group-ids ${ARRAY_VPC_SG_IDS} 
    --key-name ${EC2_KEY_PAIR_NAME} 
    --subnet-id ${VPC_SUBNET_ID} 
    --private-ip-address ${EC2_PRIVATE_ADDR} 
    --associate-public-ip-address  
    --user-data file://${FILE_INPUT} 
    --iam-instance-profile Name=${IAM_INSTANCE_PROFILE_NAME}

結果(例):

  {
    "OwnerId": "XXXXXXXXXXXX",
    "ReservationId": "r-xxxxxxxxxxxxxxxxx",
    "Groups": [],
    "Instances": [
      {
          "Monitoring": {
              "State": "disabled"
          },
          "PublicDnsName": "",
          "RootDeviceType": "ebs",
          "State": {
              "Code": 0,
              "Name": "pending"
          },
          "EbsOptimized": false,
          "LaunchTime": "2017-02-13T01:23:45.000Z",
          "PrivateIpAddress": "10.192.16.22",
          "ProductCodes": [],
          "VpcId": "vpc-xxxxxxxx",
          "StateTransitionReason": "",
          "InstanceId": "i-xxxxxxxxxxxxxxxxx",
          "ImageId": "ami-xxxxxxxx",
          "PrivateDnsName": "ip-xxx-xxx-xxx-xxx.ap-northeast-1ap-northeast-1.compute.internal",
          "KeyName": "<キーペアー名>",
          "SecurityGroups": [
              {
                  "GroupName": "EnvMaintAMI",
                  "GroupId": "sg-xxxxxxxx"
              }
          ],
          "ClientToken": "",
          "SubnetId": "subnet-xxxxxxxx",
          "InstanceType": "t2.micro",
          "NetworkInterfaces": [
              {
                  "Status": "in-use",
                  "MacAddress": "xx:xx:xx:xx:xx:xx",
                  "SourceDestCheck": true,
                  "VpcId": "vpc-xxxxxxxx",
                  "Description": "",
                  "NetworkInterfaceId": "eni-xxxxxxxx",
                  "PrivateIpAddresses": [
                      {
                          "Primary": true,
                          "PrivateIpAddress": "10.192.16.22"
                      }
                  ],
                  "Attachment": {
                      "Status": "attaching",
                      "DeviceIndex": 0,
                      "DeleteOnTermination": true,
                      "AttachmentId": "eni-attach-xxxxxxxx",
                      "AttachTime": "2017-02-13T01:23:45.000Z"
                  },
                  "Groups": [
                      {
                          "GroupName": "<キーペアー名>",
                          "GroupId": "sg-xxxxxxxx"
                      }
                  ],
                  "SubnetId": "subnet-xxxxxxxx",
                  "OwnerId": "XXXXXXXXXXXX",
                  "PrivateIpAddress": "10.192.16.22"
              }
          ],
          "SourceDestCheck": true,
          "Placement": {
              "Tenancy": "default",
              "GroupName": "",
              "AvailabilityZone": "ap-northeast-1a"
          },
          "Hypervisor": "xen",
          "BlockDeviceMappings": [],
          "Architecture": "x86_64",
          "StateReason": {
              "Message": "pending",
              "Code": "pending"
          },
          "RootDeviceName": "/dev/xvda",
          "VirtualizationType": "hvm",
          "AmiLaunchIndex": 0
      }
    ]
  }

2.2. インスタンスIDの取得

起動中のインスタンスからインスタンスIDを取得します。

コマンド
EC2_INSTANCE_ID=$( 
        aws ec2 describe-instances 
          --filters Name=private-ip-address,Values=${EC2_PRIVATE_ADDR} 
          --query 'Reservations[].Instances[].InstanceId' 
          --output text 
) 
        && echo ${EC2_INSTANCE_ID}

結果(例):

  i-xxxxxxxxxxxxxxxxx

3. 事後作業

インスタンスのステータス確認

コマンド
EC2_INSTANCE_STATE=$( 
        aws ec2 describe-instances 
        --instance-ids ${EC2_INSTANCE_ID} 
        --query 'Reservations[].Instances[].State.Name' 
        --output text 
) 
        && echo ${EC2_INSTANCE_STATE}

結果(例):

  running

完了

amzn-ami-hvm-2016.09.1.20170119-x86_64-gp2

続きを読む