1. ホーム
  2. linux

[解決済み] ユーザーデータスクリプトは私のカスタムAMIでは動作しませんが、標準のAmazon linuxでは動作しています。

2022-02-10 10:01:58

質問

ここ数日、quot;user-data script is not working"に関するトピックをたくさん検索しましたが、今のところ、私のケースについてまだ何もわかっていないです。

AWSによると ユーザーデータ の説明をご覧ください。

Amazon EC2でインスタンスを起動するとき、インスタンスにユーザーデータを渡すオプションがあり、それを使って一般的な自動構成タスクを実行したり、インスタンス起動後にスクリプトを実行したりすることもできます。

そこで、インスタンス起動時に自分のユーザーデータを渡してみました。

\#!/bin/bash

echo 'test' > /home/ec2-user/user-script-output.txt

しかし、このパスにはファイルがありません。 /home/ec2-user/user-script-output.txt

確認したところ /var/lib/cloud/instance/user-data.txt ファイルは存在し、私のユーザーデータスクリプトと同じです。

また、ログを確認すると /var/log/cloud-init.log エラーメッセージはありません。

ただ、Amazon linux(2014.09.01)で新規インスタンスを立ち上げるとuser-dataスクリプトは動いていますが、私のAMI(Amazon linuxベース)とAmazon linuxで何が違うのかがよくわかりません。

このスクリプトを実行した場合のみ、異なる部分が見られました。

sudo yum list installed | grep cloud-init

私のAMIです。

cloud-init.noarch 0.7.2-8.33.amzn1 @amzn-main

アマゾンのリナックスです。

cloud-init.noarch 0.7.2-8.33.amzn1 をインストールしました。

このせいではないでしょうか?

もっと情報が必要なら喜んで提供します、自分のAMIで何が起こったのか、どうすれば直るのか教えてください。

ありがとうございます

更新情報

ちょうどこの中から答えが見つかりました。 ポスト ,

user-dataファイルの先頭に#cloud-boothookを追加すると、動作するようになりました。

#cloud-boothook
#!/bin/bash
echo 'test' > /home/ec2-user/user-script-output.txt

でも、まだ理由はよくわからない。

どうすればいい?

User_dataは初回起動時のみ実行されます。あなたの画像はカスタム画像なので、すでに一度起動しており、user_dataは非アクティブになっているのでしょう。

Windowsの場合、以下のチェックボックスをオンにすることで可能です。 Ec2サービスプロパティ . カスタムイメージ作成の最後に自動で行う方法を今調べているところです。

linuxの場合も仕組みは同じで、カスタム画像上でuser_dataを再アクティブ化する必要があるのでしょうね。

#cloud-boothook のスクリプトを変更することで、動作するようになります。 user_data の仕組みから クラウドブースブック は、起動のたびに実行されるものです。


EDIT :

以下は、powershellを使用してWindowsのスタートを再アクティブ化するコードです。

$configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\Config.xml"
[xml] $xdoc = get-content $configFile
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2HandleUserData"} |%{ $_.State = "Enabled" }
$xdoc.SelectNodes("//Plugin") |?{ $_.Name -eq "Ec2SetComputerName"} |%{ $_.State = "Enabled" }
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile

$configFile = "C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\BundleConfig.xml"
[xml] $xdoc = get-content $configFile
$xdoc.SelectNodes("//Property") |?{ $_.Name -eq "AutoSysprep"} |%{ $_.Value = "Yes" }
$xdoc.OuterXml | Out-File -Encoding UTF8 $configFile

(私は質問の焦点linuxを知っているが、それは他の人を助けることができる...)