これまで
これまでデプロイする度にEC2インスタンスのAMIを取得して起動設定を作成、その起動設定をAutoScalingGroupへの設定をこれまで手動で行っていた。時間的には2~3分程度であったが、手作業のミスの可能性もあり当然自動化したいと思っていた。難しいかと思ったら意外とすぐできたので、今回そのスクリプトを記録しておきます。
まずシェルで実行するのでAWS cliが必要とあります。インストール方法は公式情報を元にすればできると思います。
またAWSが返してくる値にJSON形式のものがあるのでその処理のためにjqコマンドを入れておきます(sudo yum install jq)。
コード全体
instance_id=`curl http://169.254.169.254/latest/meta-data/instance-id`
instance_name=$(aws ec2 describe-instances --instance-ids $instance_id --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value' --output text)
date=`date "+%Y%m%d_%H%M"`
ami_name="${instance_name}-${date}"
ami_id=`aws ec2 create-image --instance-id $instance_id --no-reboot --name $ami_name | jq -r '.ImageId'`
launch_configuration_name="configuration_${date}"
aws autoscaling create-launch-configuration \
--launch-configuration-name $launch_configuration_name \
--image-id $ami_id \
--key-name key-pair-name \
--instance-type t2.nano \
--security-groups sg-******** sg-******** sg-******** sg-******** \
--iam-instance-profile iam-role-name
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name auto-scaling-name \
--launch-configuration-name $launch_configuration_name
まず全体としてはこのような設定になりました。起動設定の設定方法など細かい条件はそれぞれ異なると思うので、そこはoptionを変えるなりして対応してみてください。
また最初に実行すると
You must specify a region. You can also configure your region by running "aws configure".
エラーが発生することがあります。これはcliにiamロールを付与していないから発生するためで
aws configure
を実行して権限を与えてください。
- IAMFullAccess
- PowerUserAccess
わかんなければこの2つを与えたユーザーをIAMから作成して、key等を取得すればOKです。
それぞれのコード
instance_id=`curl http://169.254.169.254/latest/meta-data/instance-id`
instance_name=$(aws ec2 describe-instances --instance-ids $instance_id --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value' --output text)
まずこちらですAMI取得対象のインスタンスを決定するため、また今回はamiの名称もインスタンス名から生成することにしたので取得します。
具体的なIPアドレスが記載されていますがEC2インスタンスでこのURLにアクセスするとメタデータが取得できるみたいです。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
ami_id=`aws ec2 create-image --instance-id $instance_id --no-reboot --name $ami_name | jq -r '.ImageId'`
このコードで先程取得したインスタンスIDのAMIを取得します。ami_idが出力されるのですが
{"ImageId" : "ami-*********"}
のような形式で出力されるのでjqコマンドで値を取得します。-rオプションでダブルクォーテーションを削除しています。
aws autoscaling create-launch-configuration \
--launch-configuration-name $launch_configuration_name \ #起動設定の名称。任意のものでOK
--image-id $ami_id \ # 先程取得したAMI_ID
--key-name key-pair-name \ # キーペアの名称
--instance-type t2.nano \ # インスタンスタイプの名称
--security-groups sg-******** sg-******** sg-******** sg-******** \ # 所属するセキュリティグループをスペース区切りで
--iam-instance-profile iam-role-name # 付与するiamロール名称を
上記コードは作成したAMIを元に起動設定を作成しています。インラインで注釈を入れています。
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name auto-scaling-name \ # 設定するAutoScalingGroupの名称
--launch-configuration-name $launch_configuration_name # 先程作成した起動設定の名称
最後にAutoScalingGroupの更新を行っています。変更するのは起動設定だけなのでオプションでは起動設定の名前のみ指定しています。
割と難しいかな?と思っていたんですが書いてみるとたったの8行で実行できてしまいました。
AWSもシェルもあんまりわかっていないので修正点・改善点あれば教えていただけると助かります。