2017-08-20 36 views
0

EC2スポットインスタンスのタグをいくつか埋めたいと思いますが、スポットリクエストでは直接実行できないため、ユーザーデータスクリプトを使用して行います。地域を静的に指定するとすべてがうまくいくが、普遍的なアプローチではない。インスタンスのユーザーデータから現在の領域を検出しようとすると、領域変数は常に空です。私は、次の方法でそれを実行します。EC2インスタンス領域にユーザーデータスクリプトが設定されていません

#!/bin/bash 
region=$(ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//') 
aws ec2 create-tags \ 
    --region $region \ 
    --resources `wget -q -O - http://169.254.169.254/latest/meta-data/instance-id` \ 
    --tags Key=sometag,Value=somevalue Key=sometag,Value=somevalue 

私は

/bin/sleep 30 

を取り込む地域までの遅延を作ってみましたが、これは何の結果がありませんでした。

ただし、起動後にこのスクリプトを手動で実行すると、タグが正常に追加されます。何が起こっている?

aws-cliのすべてがプロファイルからデフォルト領域を取得しないのはなぜですか?私はaws configureがインスタンス内で正しく構成されていますが、--region節がなければ、その領域が指定されていないというエラーがスローされます。

+1

シェルスクリプトのパスを完全修飾することは、常に良い習慣です。手動で実行すると環境はおそらく '$ PATH'を含めてかなり異なっているので、' region = $(/ usr/bin/ec2-metadata ... '(あるいはそれがシステム上のどこにあっても) –

答えて

0

私はうまく働いた

region=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print" 

になってしまいました。しかし、もし誰かがナットとボルトを説明してくれれば大丈夫でしょう。

+0

Amazon EC2ハイパーバイザーが[インスタンスメタデータ](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)を提供するためのURLです。リクエストは実行されません'ec2-metadata'コマンドはあなたのためにそのURLを単に呼び出すので、作業結果は単にそれを直接呼び出します。ドキュメントは[インスタンスに関する情報]を返します(http: //docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html)。 –

2

あなたのuserdataスクリプトが実行されたときにec2-metadataコマンドが使用できないと思われます。

region=$(curl -fsq http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//') 

AWS CLIは、デフォルトのプロファイルから地域を使用しない(ec2-metadataはとにかく何をするかである)を直接メタデータサーバから地域を取得してみてください。

関連する問題