例 3: ディレクトリの作成 - AWS OpsWorks

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

例 3: ディレクトリの作成

重要

AWS OpsWorks Stacks は新規顧客を受け付けなくなりました。既存のお客様は、2024 年 5 月 26 日までは、通常どおり OpsWorks コンソール、API、CLI、および CloudFormation リソースを使用できます。その時点で廃止されます。この移行に備えて、できるだけ早くスタックを AWS Systems Manager に移行することをおすすめします。詳細については、「AWS OpsWorks Stacks サポート終了に関する FAQ」および「AWS Systems Manager アプリケーションマネージャへの AWS OpsWorks Stacks アプリケーションの移行」を参照してください。

インスタンスにパッケージをインストールするとき、多くの場合は設定ファイルを作成して適切なディレクトリに配置する必要があります。しかし、ディレクトリがまだない場合があります。また、データやログファイル用のディレクトリを作成する必要がある場合もあります。例えば、ほとんどの例で使用する Ubuntu システムを最初に起動しますが、/srv ディレクトリにはサブディレクトリがありません。アプリケーションサーバーをインストールする際に、/srv/www/ ディレクトリや場合によってはデータファイルやログなどのためにサブディレクトリが必要になるかもしれません。以下のレシピはインスタンスで /srv/www/ を作成します。

directory "/srv/www/" do mode 0755 owner 'root' group 'root' action :create end

directory resource を使用して、Linux と Windows の両方のシステムでディレクトリを作成して設定しますが、一部の属性の使用方法はシステムによって異なります。リソース名はリソースの path 属性のデフォルト値であるため、例では /srv/www/ を作成し、modeowner、および group プロパティを指定します。

レシピを実行するには
  1. opsworks_cookbooks内に createdir という名前のディレクトリを作成し、そのディレクトリに移動します。

  2. 例 1: パッケージのインストール」の説明に従って Test Kitchen を初期化、設定し、recipes 内に createdir ディレクトリを追加します。

  3. レシピコードの default.rb ファイルをクックブックの recipes サブディレクトリに追加します。

  4. kitchen converge を実行してレシピを実行します。

  5. kitchen login を実行して/srv に移動し、www サブディレクトリがあることを確認します。

  6. exit を実行して、インスタンスを実行したままワークステーションに戻ります。

注記

インスタンスのホームディレクトリに関連するディレクトリを作成するには、ホームディレクトリを示すために #{ENV['HOME']} を使用します。たとえば、以下は ~/shared ディレクトリを作成します。

directory "#{ENV['HOME']}/shared" do ... end

/srv/www/shared のようにさらに多層のディレクトリを作成したい時があるかもしれません。前述のレシピを以下のように変更できます。

directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' action :create end
レシピを実行するには
  1. default.rb のコードを前述のレシピで置き換えます。

  2. kitchen converge ディレクトリから createdir を実行します。

  3. ディレクトリが実際に作成されたことを確認するには、kitchen login を実行して /srv/www に移動し、そこに shared サブディレクトリが含まれていることを確認します。

  4. kitchen destroy を実行してインスタンスをシャットダウンします。

kitchen converge コマンドがはるかに高速に実行されたことがわかります。これはインスタンスがすでに実行中であり、インスタンスの起動や Chef のインストールなどが必要ないためです。Test Kitchen は更新されたクックブックをインスタンスにコピーし、Chef の実行を開始するだけでいいのです。

ここで再び kitchen converge を実行して、新しいインスタンスでレシピを実行します。以下のような結果になるはずです。

Chef Client failed. 0 resources updated in 1.908125788 seconds [2014-06-20T20:54:26+00:00] ERROR: directory[/srv/www/shared] (createdir::default line 1) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /srv/www does not exist, cannot create /srv/www/shared [2014-06-20T20:54:26+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) >>>>>> Converge failed on instance <default-ubuntu-1204>. >>>>>> Please see .kitchen/logs/default-ubuntu-1204.log for more details >>>>>> ------Exception------- >>>>>> Class: Kitchen::ActionFailed >>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json --log_level info] >>>>>> ----------------------

何が起きたのか。問題は、デフォルトでは directory リソースは一度に 1 個のディレクトリしか作成できないことです。ディレクトリのチェーンは作成できません。前のレシピがうまくいった理由は、インスタンスで最初に実行したレシピですでに /srv/www が作成されていたため、/srv/www/shared の作成ではサブディレクトリが 1 個つだけ作成されためです。

注記

kitchen converge を実行する場合は、レシピを実行するインスタンスが新規なのか既存のものなのかを確認してください。結果が異なる場合があります。

サブディレクトリのチェーンを作成するには、recursive 属性を directory に追加して、それを true に設定します。以下のレシピは、新しいインスタンスに /srv/www/shared を直接作成します。

directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end