2016-12-02 7 views
0

私は起動時に実行したいシェルスクリプトを持っています。このスクリプトでは、私のIPをroute53レコードセットに更新するためにaws cliを使用しています。コマンドラインから(rootユーザーとして)スクリプトを実行すると動作します。起動時に実行されると、失敗します。私はすでにルートユーザーのためにaws資格情報を設定しました。 私は私のスクリプトは、ブート時にコマンドラインから(ルートとして)スクリプトを実行すると、そのスクリプトは機能します。起動時に実行されると失敗します。

sudo cp update-route53-record.sh /etc/init.d 
sudo chmod +x /etc/init.d/update-route53-record.sh 
sudo update-rc.d update-route53-record.sh defaults 98 02 

を実行します。しかし、私は(ルートとして)コマンドラインからスクリプトを実行した場合、それが動作するインストール

#!/bin/bash 

DOMAIN_NAME="mydomain.com" 
HOSTED_ZONE_ID="Z1986XXXXXXXXX" 

main(){ 
    UPDATED_IP_LIST=$(updated_ip_list)  
    update_route53_record "$UPDATED_IP_LIST" 
} 

# Get IP List of $DOMAIN_NAME from route53 
get_ip_list(){ 
    RECORD_SET_JSON=$(aws route53 list-resource-record-sets --hosted-zone-id Z1986QIYBBYSUJ --query "ResourceRecordSets[?Name == '$DOMAIN_NAME.']") 

    #Remove the first and last character in string to convert json array to json object 
    RECORD_SET_JSON=${RECORD_SET_JSON:1:-1} 

    # Need to install jq to parse json http://xmodulo.com/how-to-parse-json-string-via-command-line-on-linux.html 
    # Get value of ResourceRecords 
    RECORD_SET_JSON=$(echo $RECORD_SET_JSON | jq -r '.ResourceRecords') 

    echo $RECORD_SET_JSON 
} 

updated_ip_list(){ 
    # Get public IP of running instance 
    IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4) 
    # IP="192.168.10.1" 

    # Get IP list from Route53 by invoking get_ip_list 
    IP_LIST=$(get_ip_list)  

    # Get length of json array 
    LENGTH=$(echo $IP_LIST | jq '. | length') 

    # Add one element to last array 
    IP_LIST=$(echo $IP_LIST | jq '.['$LENGTH'].Value |= .+ '\"$IP\"'') 

    echo $IP_LIST 
} 

update_route53_record(){ 
    JSON_REQUEST='{ 
       "Comment": "Update the A record set", 
       "Changes": [ 
       { 
        "Action": "UPSERT", 
        "ResourceRecordSet": { 
        "Name": '\"$DOMAIN_NAME\"', 
        "Type": "A", 
        "TTL": 300, 
        "ResourceRecords": '$1' 
        } 
       } 
       ] 
      }' 
    #echo $JSON_REQUEST 
    #echo "Calling API..." 
    aws route53 change-resource-record-sets --hosted-zone-id "$HOSTED_ZONE_ID" --change-batch "$JSON_REQUEST" 

    # write to log file 
    echo "aws route53 change-resource-record-sets --hosted-zone-id \"$HOSTED_ZONE_ID\" --change-batch \"$JSON_REQUEST\"" | sudo tee /var/log/update-route53.log 
} 
main 
exit 0 

マイupdate-route53-record.sh。起動時に実行されると、失敗します。私はすでにルートユーザーのためにaws資格情報を設定しました。 助けてくれますか?

+0

169.範囲は通常 "IPを取得できません"タイプのアドレスです。ネットワークカードのドライバが完全にロードされる前にスクリプトを実行しようとしていると思いますか? –

+0

@SteveMatthewsそれでは、起動時にネットワークカードのドライバが完全にロードされた後にスクリプトを実行する方法はありますか? –

+0

スクリプトの開始部分に睡眠を追加して起動することができますが、それから待ちますか? –

答えて

2

これは、あなたのユーザーデータにsudoを使用している可能性があります。 AWSはこれらのコマンドをrootとして実行し、sudoはttyを必要とするためsudoを使用することはできません。 AWS Documentationから

スクリプトは、ユーザデータがrootユーザーとして実行されているとして入力され、そのスクリプトにsudoコマンドを使用しないでください。

あなたが行ったことを確認してください。

+0

私はスクリプトでsudoコマンドを使用しませんでした –

関連する問題