Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

コンテナインスタンスのユーザーデータ設定スクリプトの例

以下のユーザーデータスクリプトの例では、起動時に Amazon ECS コンテナインスタンスを設定しています。

Amazon EFS ファイルシステムを使用する Amazon ECS-Optimized Amazon Linux AMI コンテナインスタンス

このユーザーデータスクリプトの例では、既存の Amazon EFS ファイルシステムを使用するように、Amazon ECS-optimized Amazon Linux AMI から起動されるインスタンスを設定しています。詳細については、「チュートリアル: Amazon ECS での Amazon EFS ファイルシステムの使用」を参照してください。

このスクリプトは以下の処理を実行します。

  • NFS クライアントをインストールする nfs-utils パッケージをインストールします。

  • /efs で NFS ファイルシステムのマウントディレクトリを作成します。

  • /etc/fstab ファイルにファイルシステムのマウントエントリを作成し、ファイルシステムをマウントします。

  • Amazon ECS エージェント設定ファイルにクラスター名 default を書き込みます。

このスクリプトを実際のコンテナインスタンスに使用できます。ただし、それらのインスタンスが Amazon ECS-optimized Amazon Linux AMI から起動される場合です。default クラスターを使用しない場合は、設定ファイルの ECS_CLUSTER=default 行を置き換えて、独自のクラスターの名前を指定します。コンテナインスタンスの起動の詳細については、「Amazon ECS コンテナインスタンスの起動」を参照してください。

Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" # Install nfs-utils cloud-init-per once yum_update yum update -y cloud-init-per once install_nfs_utils yum install -y nfs-utils # Create /efs folder cloud-init-per once mkdir_efs mkdir /efs # Mount /efs cloud-init-per once mount_efs echo -e 'fs-abcd1234.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' >> /etc/fstab mount -a --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Set any ECS agent configuration options echo "ECS_CLUSTER=default" >> /etc/ecs/ecs.config --==BOUNDARY==--

systemd を使用する Ubuntu コンテナインスタンス

この例のユーザーデータスクリプトは、Ubuntu 16.04 インスタンスを以下のように設定します。

  • Docker をインストールします。

  • タスク用の IAM ロールに必要な iptables ルールを作成します。

  • Amazon ECS コンテナエージェントに必要なディレクトリを作成します。

  • Amazon ECS コンテナエージェント設定ファイルを作成します。

  • エージェントをモニタリングするための systemd ユニットファイルを作成します。

  • systemd ユニットを有効にして起動します。

このスクリプトを実際のコンテナインスタンスに使用できます。ただし、それらのインスタンスが Ubuntu 16.04 AMI から起動される場合です。default クラスターを使用しない場合は、設定ファイルの ECS_CLUSTER=default 行を置き換えて、独自のクラスターの名前を指定します。コンテナインスタンスの起動の詳細については、「Amazon ECS コンテナインスタンスの起動」を参照してください。

#!/bin/bash # Install Docker apt-get update -y && apt-get install -y docker.io # Set iptables rules echo 'net.ipv4.conf.all.route_localnet = 1' >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679 # Write iptables rules to persist after reboot iptables-save > /etc/iptables/rules.v4 # Create directories for ECS agent mkdir -p /var/log/ecs /var/lib/ecs/data /etc/ecs # Write ECS config file cat << EOF > /etc/ecs/ecs.config ECS_DATADIR=/data ECS_ENABLE_TASK_IAM_ROLE=true ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true ECS_LOGFILE=/log/ecs-agent.log ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"] ECS_LOGLEVEL=info ECS_CLUSTER=default EOF # Write systemd unit file cat << EOF > /etc/systemd/system/docker-container@ecs-agent.service [Unit] Description=Docker Container %I Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm -f %i ExecStart=/usr/bin/docker run --name %i \ --restart=on-failure:10 \ --volume=/var/run:/var/run \ --volume=/var/log/ecs/:/log \ --volume=/var/lib/ecs/data:/data \ --volume=/etc/ecs:/etc/ecs \ --net=host \ --env-file=/etc/ecs/ecs.config \ amazon/amazon-ecs-agent:latest ExecStop=/usr/bin/docker stop %i [Install] WantedBy=default.target EOF systemctl enable docker-container@ecs-agent.service systemctl start docker-container@ecs-agent.service

systemdSELinux を使用する CentOS コンテナインスタンス

この例のユーザーデータスクリプトは、SELinux を使用する CentOS 7 インスタンスを以下のように設定します。

  • Docker をインストールします。

  • タスク用の IAM ロールに必要な iptables ルールを作成します。

  • Amazon ECS コンテナエージェントに必要なディレクトリを作成します。

  • Amazon ECS コンテナエージェント設定ファイルを作成します。

  • エージェントをモニタリングするための systemd ユニットファイルを作成します。

  • systemd ユニットを有効にして起動します。

注記

以下の systemd ユニットファイルの docker run コマンドには、SELinux に必要な変更 (--privileged フラグや、ボリュームマウントに対する :Z プレフィックスなど) が含まれます。

このスクリプトを実際のコンテナインスタンスに使用できます (それらのインスタンスが CentOS 7 AMI から起動される場合)。設定ファイルの ECS_CLUSTER=default 行を置き換えて、独自のクラスターの名前を指定してください (default クラスターを使用しない場合)。コンテナインスタンスの起動の詳細については、「Amazon ECS コンテナインスタンスの起動」を参照してください。

#!/bin/bash # Install Docker yum install -y docker # Set iptables rules echo 'net.ipv4.conf.all.route_localnet = 1' >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679 # Write iptables rules to persist after reboot iptables-save > /etc/sysconfig/iptables # Create directories for ECS agent mkdir -p /var/log/ecs /var/lib/ecs/data /etc/ecs # Write ECS config file cat << EOF > /etc/ecs/ecs.config ECS_DATADIR=/data ECS_ENABLE_TASK_IAM_ROLE=true ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true ECS_LOGFILE=/log/ecs-agent.log ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"] ECS_LOGLEVEL=info ECS_CLUSTER=default EOF # Write systemd unit file cat << EOF > /etc/systemd/system/docker-container@ecs-agent.service [Unit] Description=Docker Container %I Requires=docker.service After=docker.service [Service] Restart=always ExecStartPre=-/usr/bin/docker rm -f %i ExecStart=/usr/bin/docker run --name %i \ --privileged \ --restart=on-failure:10 \ --volume=/var/run:/var/run \ --volume=/var/log/ecs/:/log:Z \ --volume=/var/lib/ecs/data:/data:Z \ --volume=/etc/ecs:/etc/ecs \ --net=host \ --env-file=/etc/ecs/ecs.config \ amazon/amazon-ecs-agent:latest ExecStop=/usr/bin/docker stop %i [Install] WantedBy=default.target EOF systemctl enable docker-container@ecs-agent.service systemctl start docker-container@ecs-agent.service

デフォルト Windows ユーザーデータ

この例のユーザーデータスクリプトには、クラスター作成ウィザードを使用する場合、Windows コンテナインスタンスが受け取るデフォルトのユーザーデータが表示されます。以下のスクリプトでは、以下を実行します。

  • クラスター名を windows に設定します。

  • タスク用の IAM ロールを有効化します。

  • json-file および awslogs を使用可能なロギングドライバーとして設定します。

このスクリプトを実際のコンテナインスタンスに使用できますが (それらのインスタンスが Amazon ECS-optimized Windows AMI から起動される場合)、-Cluster windows 行を置き換えて、独自のクラスターの名前を指定してください (windows というクラスターを使用しない場合)。

<powershell> Initialize-ECSAgent -Cluster windows -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' </powershell>

Windows エージェントのインストールユーザーデータ

この例のユーザーデータスクリプトは、Windows_Server-2016-English-Full-Containers AMI で起動されたインスタンスに Amazon ECS コンテナエージェントをインストールします。これは、Amazon ECS コンテナエージェントの GitHub リポジトリ README ページのエージェントのインストール手順から変更されています。

注記

このスクリプトは、サンプル目的で共有されます。Amazon ECS-optimized Windows AMI を使用して、Windows コンテナの使用を開始するほうが、はるかに簡単です。詳細については、「クラスターの作成」を参照してください。

このスクリプトは、独自のコンテナインスタンスに使用できます (それらのインスタンスが Windows_Server-2016-English-Full-Containers AMI のバージョンで起動される場合)。windows 行を置き換えて、独自のクラスターの名前を指定します (windows クラスターを使用しない場合)。

<powershell> # Set up directories the agent uses New-Item -Type directory -Path ${env:ProgramFiles}\Amazon\ECS -Force New-Item -Type directory -Path ${env:ProgramData}\Amazon\ECS -Force New-Item -Type directory -Path ${env:ProgramData}\Amazon\ECS\data -Force # Set up configuration $ecsExeDir = "${env:ProgramFiles}\Amazon\ECS" [Environment]::SetEnvironmentVariable("ECS_CLUSTER", "windows", "Machine") [Environment]::SetEnvironmentVariable("ECS_LOGFILE", "${env:ProgramData}\Amazon\ECS\log\ecs-agent.log", "Machine") [Environment]::SetEnvironmentVariable("ECS_DATADIR", "${env:ProgramData}\Amazon\ECS\data", "Machine") # Download the agent $agentVersion = "latest" $agentZipUri = "https://s3.amazonaws.com/amazon-ecs-agent/ecs-agent-windows-$agentVersion.zip" $zipFile = "${env:TEMP}\ecs-agent.zip" Invoke-RestMethod -OutFile $zipFile -Uri $agentZipUri # Put the executables in the executable directory. Expand-Archive -Path $zipFile -DestinationPath $ecsExeDir -Force Set-Location ${ecsExeDir} # Set $EnableTaskIAMRoles to $true to enable task IAM roles # Note that enabling IAM roles will make port 80 unavailable for tasks. [bool]$EnableTaskIAMRoles = $false if (${EnableTaskIAMRoles}) { $HostSetupScript = Invoke-WebRequest https://raw.githubusercontent.com/aws/amazon-ecs-agent/master/misc/windows-deploy/hostsetup.ps1 Invoke-Expression $($HostSetupScript.Content) } # Install the agent service New-Service -Name "AmazonECS" ` -BinaryPathName "$ecsExeDir\amazon-ecs-agent.exe -windows-service" ` -DisplayName "Amazon ECS" ` -Description "Amazon ECS service runs the Amazon ECS agent" ` -DependsOn Docker ` -StartupType Manual sc.exe failure AmazonECS reset=300 actions=restart/5000/restart/30000/restart/60000 sc.exe failureflag AmazonECS 1 Start-Service AmazonECS </powershell>