AWS CLIでサービスの各種コマンドを動かしてみる(EC2編3: イメージ)
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 [email protected] 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については長くなりそうなので別エントリにて。