

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

# Linux サーバーでのソフトウェアのカスタマイズ
<a name="customize-containers-ec2"></a>

このセクションでは、Linux を実行する EC2 インスタンス上のソフトウェアをカスタマイズするための設定ファイルに含めることのできる情報の種類について説明します。Elastic Beanstalk 環境のカスタマイズと設定に関する一般的な情報については、「[Elastic Beanstalk 環境の設定](customize-containers.md)」を参照してください。Windows を実行する EC2 インスタンス上のソフトウェアをカスタマイズする方法については、[Windows サーバーでのソフトウェアのカスタマイズ](customize-containers-windows-ec2.md)を参照してください。

アプリケーションが依存するソフトウェアをカスタマイズして設定できます。インスタンスのプロビジョニング中に実行するコマンドを追加できます。たとえば、Linux ユーザーとグループの定義、環境インスタンスでのファイルのダウンロード、またはファイルの直接作成ができます。このようなファイルには、アプリケーションで必要な依存関係 (yum リポジトリからの追加パッケージなど) や、Elastic Beanstalk によるデフォルトの特定の設定を上書きするプロキシ構成ファイルの代わりとなる設定ファイルなどがあります。

**注意事項**  
Amazon Linux 2 プラットフォームでは、.ebextensions 設定ファイルでファイルとコマンドを提供する代わりに、可能な限り *Buildfile*、*Procfile*、および*プラットフォームフック*を使用して、インスタンスのプロビジョニング中に環境インスタンスでカスタムコードを設定および実行することを強くお勧めします。これらのメカニズムの詳細については、「[Elastic Beanstalk Linux プラットフォームの拡張](platforms-linux-extend.md)」を参照してください。
YAML は、一貫したインデントに依存します。設定ファイルの例でコンテンツを置き換える際はインデントレベルを一致させ、テキストエディタがインデントにタブ文字ではなくスペースを使用していることを確認します。

設定ファイルは、アプリケーションが実行している Linux サーバーに影響する次のキーをサポートしています。

**Topics**
+ [パッケージ](#linux-packages)
+ [グループ](#linux-groups)
+ [[ユーザー]](#linux-users)
+ [[Sources] (出典)](#linux-sources)
+ [ファイル](#linux-files)
+ [コマンド](#linux-commands)
+ [サービス](#linux-services)
+ [コンテナコマンド](#linux-container-commands)
+ [例: カスタム Amazon CloudWatch メトリクスの使用](customize-containers-cw.md)

キーは、上に表示した順に処理されます。

設定ファイルの作成およびテスト中は、環境の[イベント](using-features.events.md)を監視します。Elastic Beanstalk は、無効なキーなどの検証エラーが含まれている設定ファイルを無視し、同じファイルに含まれている他のキーを一切処理しません。これが発生すると、Elastic Beanstalk は警告イベントをイベントログに追加します。

## パッケージ
<a name="linux-packages"></a>

`packages` キーを使用して、パッケージ済みのアプリケーションとコンポーネントをダウンロードしてインストールできます。

### 構文
<a name="linux-packages-syntax"></a>

```
packages: 
  {{name of package manager}}:
    {{package name}}: {{version}}
    ...
  {{name of package manager}}:
    {{package name}}: {{version}}
    ...
  ...
```

各パッケージマネージャのキーで複数のパッケージを指定できます。

### サポートされるパッケージ形式
<a name="linux-packages-support"></a>

現在 Elastic Beanstalk がサポートしているパッケージマネージャは、yum、rubygems、python、および rpm です。パッケージは rpm、yum、rubygems、python の順序で処理されます。rubygems と python の間に順序はありません。各パッケージマネージャ内では、パッケージのインストール順序は保証されません。オペレーティングシステムでサポートされているパッケージマネージャを使用します。

**注記**  
Elastic Beanstalk は、Python の基盤となるパッケージマネージャとして pip と easy\_install をサポートしています。ただし、設定ファイルの構文では、パッケージマネージャ名を `python` にする必要があります。設定ファイルを使用して Python のパッケージマネージャを指定すると、Elastic Beanstalk は Python 2.7 を使用します。アプリケーションが別のバージョンの Python に依存する場合は、インストールするパッケージを `requirements.txt` ファイルで指定できます。詳細については、「[Elastic Beanstalk での要件ファイルを使用した依存関係の指定](python-configuration-requirements.md)」を参照してください。

### バージョンの指定
<a name="linux-packages-versions"></a>

各パッケージマネージャ内では、各パッケージはパッケージ名およびバージョンのリストとして指定されます。バージョンは、文字列、バージョンのリスト、あるいは空の文字列またはリストのいずれでもかまいません。空の文字列またはリストは、最新バージョンを指定することを示します。rpm マネージャの場合、バージョンはディスク上のファイルへのパスまたは URL として指定します。相対パスはサポートされていません。

パッケージのバージョンを指定した場合は、それより新しいバージョンのパッケージがインスタンスに既にインストールされていたとしても、指定されたバージョンのインストールが試みられます。新しいバージョンが既にインストールされていた場合、デプロイは失敗します。パッケージマネージャには、複数のバージョンをサポートするものと、サポートしないものがあります。詳細については、パッケージマネージャのドキュメントを調べてください。バージョンを指定せず、あるバージョンのパッケージが既にインストールされている場合は、Elastic Beanstalk は新しいバージョンをインストールせず、ユーザーが既存のバージョンを維持して使用することを望んでいるものと想定します。

### 例
<a name="linux-packages-snippet"></a>

次の例では、rpm のバージョン URL を指定し、yum から最新のバージョンを要求し、rubygems から chef のバージョン 0.10.2 を要求しています。

```
packages: 
  yum:
    libmemcached: [] 
    ruby-devel: []
    gcc: []
  rpm:
    epel: http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
  rubygems: 
    chef: '0.10.2'
```

## グループ
<a name="linux-groups"></a>

`groups` キーを使用すると、Linux/UNIX グループを作成して、グループ ID を割り当てることができます。グループを作成するには、新しいグループ名をオプションのグループ ID に関連付ける新しいキーと値のペアを追加します。groups キーでは、1 つまたは複数のグループ名を指定できます。次の表では使用できるキーの一覧を示します。

### 構文
<a name="linux-groups-syntax"></a>

```
groups:
  {{name of group}}: {}
  {{name of group}}:
    gid: "{{group id}}"
```

### オプション
<a name="linux-groups-options"></a>

`gid`  
グループ ID 番号です。  
グループ ID を指定し、同じ名前のグループが既に存在する場合、グループの作成は失敗します。指定したグループ ID が別のグループに割り当てられている場合、オペレーティングシステムはグループの作成を拒否することがあります。

### 例
<a name="linux-groups-snippet"></a>

次の例では、groupOne という名前のグループをグループ ID なしで指定し、groupTwo という名前のグループをグループ ID 値 45 で指定しています。

```
groups:
  groupOne: {}
  groupTwo:
    gid: "{{45}}"
```

## [ユーザー]
<a name="linux-users"></a>

`users` キーを使用すると、Linux/UNIX ユーザーを EC2 インスタンス上に作成できます。

### 構文
<a name="linux-users-syntax"></a>

```
users:
  {{name of user}}:
    groups:
      - {{name of group}}
    uid: "{{id of the user}}"
    homeDir: "{{user's home directory}}"
```

### オプション
<a name="linux-users-options"></a>

`uid`  
ユーザー ID です。異なるユーザー ID で同じユーザー名が存在した場合、作成処理は失敗します。ユーザー ID が既存のユーザーに既に割り当てあれている場合、オペレーティングシステムは作成要求を拒否することがあります。

`groups`  
グループ名のリストです。ユーザーはリスト内の各グループに追加されます。

`homeDir`  
ユーザーのホームディレクトリです。

ユーザーは、`/sbin/nologin` のシェルで非対話形式のシステムユーザーとして作成されます。これは設計によるものであり、変更できません。

### 例
<a name="linux-users-snippet"></a>

```
users:
  myuser:
    groups:
      - {{group1}}
      - {{group2}}
    uid: "{{50}}"
    homeDir: "{{/tmp}}"
```

## [Sources] (出典)
<a name="linux-sources"></a>

`sources` キーを使用すると、公開 URL からアーカイブファイルをダウンロードし、EC2 インスタンス上のターゲットディレクトリに解凍できます。

### 構文
<a name="linux-sources-syntax"></a>

```
sources:
  {{target directory}}: {{location of archive file}}
```

### サポートされる形式
<a name="linux-sources-support"></a>

サポートされる形式は、tar、tar\+gzip、tar\+bz2、zip です。Amazon Simple Storage Service (Amazon S3) などの外部の場所 (`https://amzn-s3-demo-bucket.s3.amazonaws.com/myobject` など) は、その URL がパブリックアクセス可能であれば参照できます。

### 例
<a name="linux-sources-example"></a>

以下の例では、Amazon S3 バケットから公開 .zip ファイルをダウンロードし、`/etc/myapp` に解凍しています。

```
sources:  
  /etc/myapp: https://amzn-s3-demo-bucket.s3.amazonaws.com/myobject
```

**注記**  
複数の抽出で同じターゲットパスを再利用しないでください。別のソースを同じターゲットパスに抽出すると、コンテンツに追加する代わりに置き換えます。

## ファイル
<a name="linux-files"></a>

`files` キーを使用すると、EC2 インスタンス上にファイルを作成できます。内容は、設定ファイルにおいてインラインで指定することも、URL から取得することもできます。ファイルは辞書式順序でディスクに書き込まれます。

`files` キーを使用し、承認用のインスタンスプロファイルを指定することで、Amazon S3 からプライベートファイルをダウンロードできます。

指定したファイルパスが既にインスタンスに存在する場合、既存のファイルは名前に拡張子 `.bak` が付加されたまま保持されます。

### 構文
<a name="linux-files-syntax"></a>

```
files:  
  "{{target file location on disk}}": 
     mode: "{{six-digit octal value}}"
     owner: {{name of owning user for file}}
     group: {{name of owning group for file}}
     source: {{URL}}
     authentication: {{authentication name}}:

  "{{target file location on disk}}": 
     mode: "{{six-digit octal value}}"
     owner: {{name of owning user for file}}
     group: {{name of owning group for file}}
     content: |
      {{# this is my}}
      {{# file content}}
     encoding: {{encoding format}}
     authentication: {{authentication name}}:
```

### オプション
<a name="linux-files-options"></a>

`content`  
ファイルに追加する文字列コンテンツ。`content` または `source` を指定します。両方を指定することはできません。

`source`  
ダウンロードするファイルの URL。`content` または `source` を指定します。両方を指定することはできません。

`encoding`  
`content` オプションで指定された文字列のエンコード形式。  
有効な値: `plain` \| `base64`

`group`  
ファイルを所有している Linux グループ。

`owner`  
ファイルを所有している Linux ユーザー。

`mode`  
このファイルのモードを表す 6 桁の 8 進値です。Windows システムではサポートされていません。最初の 3 桁はシンボリックリンクに使用し、最後の 3 桁は権限の設定に使用します。シンボリックリンクを作成するには、`120{{xxx}}` を指定します (`xxx` はターゲットファイルのアクセス許可を定義します)。ファイルのアクセス許可を指定するには、「`000644`」のように後半 3 桁の数字を使用します。

`authentication`  
使用する [CloudFormation 認証方法](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html)の名前。リソースキーで、Auto Scaling グループメタデータに認証方法を追加できます。例については、以下を参照してください。

### 例
<a name="linux-files-snippet"></a>

```
files:
  "/home/ec2-user/myfile" :
    mode: "000755"
    owner: root
    group: root
    source: http://foo.bar/myfile
 
  "/home/ec2-user/myfile2" :
    mode: "000755"
    owner: root
    group: root
    content: |
      this is my
      file content
```

シンボリックリンクを使用する例。これは、既存のファイル `/tmp/myfile2.txt` を指すリンク `/tmp/myfile1.txt` を作成します。

```
files:
  "/tmp/myfile2.txt" :
    mode: "120400"
    content: "/tmp/myfile1.txt"
```

次の例では、リソースキーを使用して S3Auth という認証方法を追加して、Amazon S3 バケットから秘密ファイルをダウンロードするのに使用します。

```
Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        {{S3Auth}}:
          type: "s3"
          buckets: ["{{amzn-s3-demo-bucket2}}"]
          roleName:
            "Fn::GetOptionSetting":
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"

files:
  "{{/tmp/data.json}}" :
    mode: "000755"
    owner: root
    group: root
    authentication: "{{S3Auth}}"
    source: {{https://elasticbeanstalk-us-west-2-123456789012.s3-us-west-2.amazonaws.com/data.json}}
```

## コマンド
<a name="linux-commands"></a>

`commands` キーを使用すると、EC2 インスタンスでコマンドを実行できます。このコマンドは、アプリケーションとウェブサーバーがセットアップされ、アプリケーションバージョンファイルが抽出される前に実行されます。

指定されたコマンドはルートユーザーとして実行され、名前のアルファベット順に処理されます。デフォルトでは、コマンドはルートディレクトリで実行します。別のディレクトリからコマンドを実行するには、`cwd` オプションを使用します。

コマンドの問題をトラブルシューティングするには、[インスタンスログ](using-features.logging.md)で出力を確認できます。

### 構文
<a name="linux-commands-syntax"></a>

```
commands:
  {{command name}}: 
    command: {{command to run}}
    cwd: {{working directory}}
    env: 
      {{variable name}}: {{variable value}}
    test: {{conditions for command}} 
    ignoreErrors: true
```

### オプション
<a name="linux-commands-options"></a>

`command`  
実行するコマンドを指定する配列 (YAML シンタックスの[ブロックシーケンスコレクション](http://yaml.org/spec/1.2/spec.html#id2759963)) または文字列。重要な注意点:  
+ 文字列を使用する場合は、文字列全体を引用符で囲む必要はありません。引用符で囲む場合は、同じタイプの引用符がリテラルとして出現した場合にエスケープします。
+ 配列を使用する場合、スペース文字をエスケープしたり、コマンドパラメータを引用符で囲んだりする必要はありません。配列の各要素が 1 つのコマンド引数です。配列を使用して複数のコマンドを指定しないでください。
以下の例はすべて同等です。  

```
commands:
  command1:
    command: git commit -m "This is a comment."
  command2:
    command: "git commit -m \"This is a comment.\""
  command3:
    command: 'git commit -m "This is a comment."'
  command4:
    command:
      - git
      - commit
      - -m
      - This is a comment.
```
複数のコマンドを指定するには、次の例に示すように、[リテラルブロックスカラー](http://yaml.org/spec/1.2/spec.html#id2760844)を使用します。  

```
commands:
  command block:
    command: |
      git commit -m "This is a comment."
      git push
```

`env`  
（オプション）コマンドの環境変数を設定します。このプロパティは、既存の環境に追加するのではなく、既存の環境を上書きします。

`cwd`  
（オプション）作業ディレクトリです。指定されていない場合、コマンドはルート ディレクトリ (/) から実行します。

`test`  
(オプション) Elastic Beanstalk が `command` キーに含まれるコマンド (シェルスクリプトなど) を処理するために、値 `true` (終了コード 0) を返す必要があるコマンドです。

`ignoreErrors`  
（オプション）`command` キーに含まれるコマンドが失敗した場合（非ゼロ値を返した場合）、他のコマンドを実行する必要があるかどうかを指定するブール値です。失敗したコマンドがあっても他のコマンドの実行を続ける場合は、この値を `true` に設定します。コマンドが失敗したら実行を停止する場合は、`false` に設定します。デフォルト値は `false` です。

### 例
<a name="linux-commands-snippet"></a>

次の例では Python スクリプトを実行します。

```
commands:
  python_install:
    command: myscript.py
    cwd: /home/ec2-user
    env:
      myvarname: myvarvalue
    test: "[ -x /usr/bin/python ]"
```

## サービス
<a name="linux-services"></a>

`services` キーを使用すると、インスタンスが起動されるときに開始または停止する必要のあるサービスを定義できます。また、`services` キーではソース、パッケージ、ファイルへの依存関係も指定でき、インストールされているファイルのために再起動が必要になった場合に、Elastic Beanstalk がサービスの再起動を処理します。

### 構文
<a name="linux-services-syntax"></a>

```
services:
  sysvinit:
    {{name of service}}:
      enabled: "true"
      ensureRunning: "true"
      files: 
        - "{{file name}}"
      sources: 
        - "{{directory}}"	
      packages: 
        {{name of package manager}}:
          "{{package name}}[: {{version}}]"
      commands: 
        - "{{name of command}}"
```

### オプション
<a name="linux-services-options"></a>

`ensureRunning`  
`true` に設定すると、Elastic Beanstalk が終了した後でサービスが実行されます。  
`false` に設定すると、Elastic Beanstalk が終了した後でサービスは実行されません。  
このキーを省略すると、サービスの状態は変更されません。

`enabled`  
`true` に設定すると、起動時にサービスが自動的に開始されます。  
`false` に設定すると、起動時にサービスが自動的に開始されません。  
このキーを省略すると、このプロパティは変更されません。

`files`  
ファイルのリストです。Elastic Beanstalk がファイルブロックによって直接変更した場合、サービスは再起動されます。

`sources`  
ディレクトリのリストです。Elastic Beanstalk がこれらのディレクトリの 1 つにアーカイブを拡張した場合、サービスは再起動されます。

`packages`  
パッケージ名のリストに対するパッケージマネージャのマップです。Elastic Beanstalk がこれらのパッケージの 1 つをインストールまたは更新した場合、サービスは再起動されます。

`commands`  
コマンド名のリストです。Elastic Beanstalk が指定したコマンドを実行すると、サービスは再起動されます。

### 例
<a name="linux-services-snippet"></a>

次に例を示します。

```
services: 
  sysvinit:
    myservice:
      enabled: true
      ensureRunning: true
```

## コンテナコマンド
<a name="linux-container-commands"></a>

`container_commands` キーを使用して、アプリケーションのソースコードに影響するコマンドを実行できます。コンテナコマンドは、アプリケーションおよびウェブサーバーが設定され、アプリケーションバージョンアーカイブが抽出された後、アプリケーションバージョンがデプロイされる前に実行されます。コンテナ以外のコマンドと他のカスタマイズオペレーションは、アプリケーションソースコードが抽出される前に実行されます。

指定されたコマンドはルートユーザーとして実行され、名前のアルファベット順に処理されます。コンテナコマンドは、ソースコードがアプリケーションサーバーにデプロイされる前に抽出されたステージングディレクトリから実行されます。コンテナコマンドを使用してステージングディレクトリにあるソースコードに対して行うすべての変更は、ソースが最終的な場所にデプロイされる際に含まれます。

**注記**  
コンテナコマンドの出力は、`cfn-init-cmd.log` インスタンスログに記録されます。インスタンスログの取得と表示の詳細については、「[Amazon EC2 インスタンスからのログの表示](using-features.logging.md)」を参照してください。

`leader_only` を使用して、1 つのインスタンスでコマンドを実行するか、テストコマンドが `test` と評価される場合のみコマンドを実行するよう `true` を設定できます。リーダー専用コンテナコマンドは、環境の作成およびデプロイ中のみ実行されます。他のコマンドやサーバーカスタマイズオペレーションは、インスタンスがプロビジョニングまたは更新されるたびに実行されます。リーダー専用コンテナコマンドは、AMI ID やインスタンスタイプの変更などの起動設定の変更によって実行されることはありません。

### 構文
<a name="linux-container-commands-syntax"></a>

```
container_commands:
  {{name of container_command}}:
    command: "{{command to run}}"
    leader_only: true
  {{name of container_command}}:
    command: "{{command to run}}"
```

### オプション
<a name="linux-container-commands-options"></a>

`command`  
実行する文字列または文字列の配列。

`env`  
(オプション) コマンドを実行する前に環境変数を設定し、既存の値を上書きします。

`cwd`  
（オプション）作業ディレクトリです。デフォルトでは、これは解凍されたアプリケーションのステージングディレクトリです。

`leader_only`  
(オプション) Elastic Beanstalk によって選択された単一のインスタンスでコマンドを実行するのみです。リーダー専用コンテナコマンドは、他のコンテナコマンドより前に実行されます。コマンドはリーダー専用または `test` を持つことができますが、両方はできません (`leader_only` が優先されます)。

`test`  
(オプション) このコンテナコマンドを実行するために、`true` を返す必要があるテストコマンドを実行します。コマンドはリーダー専用または `test` を持つことができますが、両方はできません (`leader_only` が優先されます)。

`ignoreErrors`  
(オプション) このコンテナコマンドが 0 (成功) 以外の値を返す場合は、デプロイに失敗しません。有効にするには、`true` に設定します。

### 例
<a name="linux-container-commands-snippet"></a>

次に例を示します。

```
container_commands:
  collectstatic:
    command: "django-admin.py collectstatic --noinput"
  01syncdb:
    command: "django-admin.py syncdb --noinput"
    leader_only: true
  02migrate:
    command: "django-admin.py migrate"
    leader_only: true
  99customize:
    command: "scripts/customize.sh"
```