AWS CLIでサービスの各種コマンドを動かしてみる(EC2編3: イメージ)

2013.08.31

EC2編第3弾は『イメージ』に関してです。ちょっと準備を必要としたのでその辺もまとめて。

実践用のEC2準備

今回エントリの実践用に、適当なEC2を準備する事にします。まずはキーペアの作成。

$ export AWS_DEFAULT_REGION=ap-northeast-1
$ aws ec2 create-key-pair --key-name aws-study-key
{
    "KeyPair": {
        "KeyMaterial": "-----BEGIN RSA PRIVATE KEY-----\nMII(中略)zWw+w==\n-----END RSA PRIVATE KEY-----", 
        "KeyName": "aws-study-key", 
        "KeyFingerprint": "XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
    }
}

そしてAMIを作成するベースとなる適当なEC2も作成。この際利用したセキュリティグループは、手動作成/HTTP及びSSHのポートを許可したセキュリティグループ(の登場)を利用しています。

$ aws ec2 run-instances --image-id ami-39b23d38 --min-count 1 --max-count 1 --key-name aws-study-key --security-group-ids sg-089de309
{
    "OwnerId": "317282958305", 
    "ReservationId": "r-c8b25fcc", 
    "Groups": [
        {
            "GroupName": "sg_sshandhttp", 
            "GroupId": "sg-089de309"
        }
    ], 
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            }, 
            "PublicDnsName": null, 
            "KernelId": "aki-44992845", 
            "State": {
                "Code": 0, 
                "Name": "pending"
            }, 
            "EbsOptimized": false, 
            "LaunchTime": "2013-07-22T06:54:38.000Z", 
            "ProductCodes": [], 
            "StateTransitionReason": null, 
            "InstanceId": "i-c6907cc2", 
            "ImageId": "ami-39b23d38", 
            "PrivateDnsName": null, 
            "KeyName": "aws-study-key", 
            "SecurityGroups": [
                {
                    "GroupName": "sg_sshandhttp", 
                    "GroupId": "sg-089de309"
                }
            ], 
            "ClientToken": null, 
            "InstanceType": "m1.small", 
            "NetworkInterfaces": [], 
            "Placement": {
                "Tenancy": "default", 
                "GroupName": null, 
                "AvailabilityZone": "ap-northeast-1c"
            }, 
            "Hypervisor": "xen", 
            "BlockDeviceMappings": [], 
            "Architecture": "x86_64", 
            "StateReason": {
                "Message": "pending", 
                "Code": "pending"
            }, 
            "RootDeviceName": "/dev/sda1", 
            "VirtualizationType": "paravirtual", 
            "RootDeviceType": "ebs", 
            "AmiLaunchIndex": 0
        }
    ]
}

コンソール上でも識別出来るようにタグ情報も不可しておきます。

$ aws ec2 create-tags --resources i-c6907cc2 --tags '[{"key": "Name", "value": "EC2-ImageTest"}]'
{
    "return": "true"
}

EC2にログイン。適当に環境を導入しておきます。

$ ssh -i aws-study-key.pem ec2-user@ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com (XX.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 'ec2-XX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com,XX.XXX.XXX.XXX' (RSA) to the list of known hosts.

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

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
There are 6 security update(s) out of 11 total update(s) available
Run "sudo yum update" to apply all updates.
$
$ sudo yum update -y

Apacheのインストール:

$ sudo yum install -y httpd
$ sudo chkconfig httpd on

Groovyのインストール:

$ java -version
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.11.90) (amazon-62.1.11.11.90.55.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
$
$ vi .bash_profile
---------------------------
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin#PATH=$PATH:$HOME/bin
GROOVY_HOME=/home/ec2-user/groovy-2.1.6
PATH=$PATH:$GROOVY_HOME/bin
export PATH
---------------------------
$ source .bash_profile
$ groovy -v
Groovy Version: 2.1.6 JVM: 1.6.0_24 Vendor: Sun Microsystems Inc. OS: Linux
$

aws-cliのインストール:

$ python --version
Python 2.6.8
$ sudo easy_install pip
$ sudo pip install awscli
$ sudo pip install awscli --upgrade
$ complete -C aws_completer aws
$ vi .bash_profile
-------
export AWS_ACCESS_KEY_ID=<アクセスキーID>
export AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー>
export AWS_DEFAULT_REGION=ap-northeast-1
complete -C aws_completer aws
-------
$ source .bash_profile
$ aws --version
aws-cli/0.13.2 Python/2.6.8 Linux/3.4.43-43.43.amzn1.x86_64

jqのインストール:

$ sudo yum install -y jq
$ jq --version
jq version 1.2

イメージ(image)に関する操作

関連するコマンドは以下の8つ。

create-image
copy-image
describe-images

describe-image-attribute
modify-image-attribute
reset-image-attribute

register-image
deregister-image

create-image

"実行中"(running)若しくは"停止"(stopped)のインスタンスから、EBS-Backed AMIイメージを作成します。以下では上記で作成したEC2のinstance-idと、任意にAMIの名称を指定して実行しています。

$ aws ec2 stop-instances --instance-ids i-c6907cc2
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ aws ec2 create-image --instance-id i-c6907cc2 --name myFirstAMIImag
{
    "ImageId": "ami-4d3bac4c"
}

copy-image

AMIイメージをコピーします。

$ aws ec2 copy-image --source-region ap-northeast-1 --source-image-id ami-4d3bac4c --name secondAmiImage
{
    "ImageId": "ami-693bac68"
}

describe-images

関連するイメージ情報を表示します。

検索条件を指定しないと対象全件取りに行ってしまうので(その数8000件超)...

$ aws ec2 describe-images | jq '.[] | length'
1
8632

実利用の際はイメージID等で絞込みする必要がありそうです。

$ aws ec2 describe-images --image-ids ami-39b23d38
{
    "Images": [
        {
            "VirtualizationType": "paravirtual", 
            "Name": "amzn-ami-pv-2013.03.1.x86_64-ebs", 
            "Hypervisor": "xen", 
            "ImageOwnerAlias": "amazon", 
            "ImageId": "ami-39b23d38", 
            "RootDeviceType": "ebs", 
            "State": "available", 
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1", 
                    "Ebs": {
                        "DeleteOnTermination": true, 
                        "SnapshotId": "snap-826a82a0", 
                        "VolumeSize": 8, 
                        "VolumeType": "standard"
                    }
                }
            ], 
            "Architecture": "x86_64", 
            "ImageLocation": "amazon/amzn-ami-pv-2013.03.1.x86_64-ebs", 
            "KernelId": "aki-44992845", 
            "OwnerId": "137112412989", 
            "RootDeviceName": "/dev/sda1", 
            "Public": true, 
            "ImageType": "machine", 
            "Description": "Amazon Linux AMI x86_64 PV EBS"
        }
    ], 
    "ResponseMetadata": {
        "RequestId": "84dc89ca-efcf-4c93-aea1-cdc1defbedfe"
    }
}
$

describe-image-attribute

イメージの属性値を表示します。

ヘルプを見ると、利用可能な属性(--attribute)は"productCodes","kernel","ramdisk","launchPermission","blockDeviceMapping"となっています。AMI LinuxのIDを使ってアクセスしてみます。

$ aws ec2 describe-image-attribute --image-id ami-39b23d38 --attribute productCodes
{
    "ProductCodes": [], 
    "Errors": [
        {
            "Message": "Not authorized for image:ami-39b23d38", 
            "Code": "AuthFailure"
        }
    ], 
    "Description": {}, 
    "LaunchPermissions": [], 
    "ResponseMetadata": {
        "RequestId": "84283a58-fc85-412c-8302-58e656371eee"
    }, 
    "BlockDeviceMappings": [], 
    "KernelId": {}, 
    "RamdiskId": {}
}A client error (AuthFailure) occurred: Not authorized for image:ami-39b23d38

おや?エラーが。エラーメッセージで検索してみると『対象がpublicじゃないからなのでは?』みたいな事書いてますね。

インスタンスの属性値を見てみます…う〜む、(対象項目これで合ってるのならば)true、ですね…。属性値(pubilc)や権限で何か設定が必要なのでしょうか。引き続き調査の方向で。

$ aws ec2 describe-images --image-ids ami-39b23d38 | jq '.Images[].Public'
true

modify-image-attribute

AMIイメージに関する属性を編集します。

ヘルプによると編集出来る属性は限られている模様。この形で実行は出来ましたが…何がどう変わったのかな?ちょっとこの辺も保留。

$ aws ec2 modify-image-attribute --image-id ami-39b23d38 --attribute launchPermission --operation-type add
{
    "return": "true", 
    "ResponseMetadata": {
        "RequestId": "4214ce14-4371-457e-a4c9-9bc1a89cfb9f"
    }
}

reset-image-attribute

所定のイメージ属性情報をリセットします。

使い方的にはmodify-image-attributeと同じようですが、こちらも同様にエラーが出てしまいますね...

]$ aws ec2 reset-image-attribute --image-id ami-39b23d38 --attribute launchPermission
{
    "Errors": [
        {
            "Message": "Not authorized for image:ami-39b23d38", 
            "Code": "AuthFailure"
        }
    ], 
    "ResponseMetadata": {
        "RequestId": "ae1057f8-7cef-45b2-9f21-ceb9a36f1181"
    }
}
A client error (AuthFailure) occurred: Not authorized for image:ami-39b23d38

register-image

EC2(環境)にAMIイメージを登録します。イメージは起動前に登録する必要があります。詳しくはRunInstanceの項を参照。それぞれのAMIは、AmazonEC2サービスのresiser-image操作によって提供される一意のIDに関連付けられます。

登録時、AmazonEC2はS3から指定された、イメージのマニフェストを取得しイメージを登録したユーザーが所有している事を検証します。S3イメージへの変更作業は、この登録情報を無効にしてしまいます。イメージを変更した場合は、以前のイメージを削除し、新しく登録し直してください。詳細についてはDeregisterImageの項を参照。

deregister-image

AMIを登録解除します。一旦登録解除されてしまうと、AMIのインスタンスは実行される事は無くなります。

※register-image/deregister-imageについては長くなりそうなので別エントリにて。