翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
例 9: Amazon EC2 インスタンスの使用
重要
AWS OpsWorks Stacks は新規顧客を受け付けなくなりました。既存のお客様は、2024 年 5 月 26 日までは、通常どおり OpsWorks コンソール、API、CLI、および CloudFormation リソースを使用できます。その時点で廃止されます。この移行に備えて、できるだけ早くスタックを AWS Systems Manager に移行することをおすすめします。詳細については、「AWS OpsWorks Stacks サポート終了に関する FAQ」および「AWS Systems Manager アプリケーションマネージャへの AWS OpsWorks Stacks アプリケーションの移行」を参照してください。
ここまでは、 でインスタンスをローカルで実行しています VirtualBox。これは迅速かつ簡単ですが、最終的には Amazon EC2 インスタンスでレシピをテストすることになります。特に Amazon Linux でのレシピの実行する場合は Amazon EC2 でのみ可能です。予備的な実装やテストには CentOS などのような類似システムを使用できますが、Amazon Linux のレシピを完全にテストするには、Amazon EC2 インスタンスを使用するしかありません。
このトピックでは Amazon EC2 インスタンスでレシピを実行する方法を説明します。前述のセクションとほとんど同じ方法で Test Kitchen や Vagrant を使用しますが、2 つ違いがあります。
-
ドライバは Vagrant ではなく
kitchen-ec2
です。 -
クックブックの
.kitchen.yml
ファイルには、Amazon EC2 インスタンスの起動に必要な情報で設定する必要があります。
注記
代替手段として、vagrant-aws
Vagrant プラグインを使用する方法があります。詳細については、「Vagrant AWS プロバイダ
Amazon EC2 インスタンスを作成するには、AWS 認証情報が必要です。AWS アカウントを持っていない場合は、以下のように取得できます。
AWS アカウントへのサインアップ
AWS アカウントがない場合は、以下のステップを実行して作成します。
AWS アカウント にサインアップするには
オンラインの手順に従います。
サインアップ手順の一環として、通話呼び出しを受け取り、電話のキーパッドを使用して検証コードを入力するように求められます。
AWS アカウントにサインアップすると、AWS アカウントのルートユーザーが作成されます。ルートユーザーには、アカウントのすべての AWS のサービスとリソースへのアクセス権があります。セキュリティのベストプラクティスとして、管理ユーザーに管理アクセスを割り当て、ルートユーザーアクセスが必要なタスクを実行する場合にのみ、ルートユーザーを使用してください。
サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/
管理ユーザーの作成
AWS アカウント にサインアップしたら、AWS アカウントのルートユーザー をセキュリティで保護し、AWS IAM Identity Center を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。
AWS アカウントのルートユーザーをセキュリティで保護する
-
[ルートユーザー] を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として AWS Management Console
にサインインします。次のページでパスワードを入力します。 ルートユーザーを使用してサインインする方法については、「AWS サインイン User Guide」の「Signing in as the root user」を参照してください。
-
ルートユーザーの多要素認証 (MFA) を有効にします。
手順については、「IAM ユーザーガイド」の「AWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)」を参照してください。
管理ユーザーを作成する
-
IAM アイデンティティセンターを有効にします。
手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Center の有効化」を参照してください。
-
IAM アイデンティティセンターで、管理ユーザーに管理者アクセスを付与します。
IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM Identity Center ユーザーガイド」の「デフォルトの IAM アイデンティティセンターディレクトリ でユーザーアクセスを設定する」を参照してください。
管理ユーザーとしてサインインする
-
IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。
IAM アイデンティティセンターのユーザーを使用してサインインする方法については、「AWS サインイン User Guide」の「Signing in to the AWS access portal」を参照してください。
Amazon EC2 へのアクセス許可を持つ IAM ユーザーを作成し、ユーザーのアクセスキーとシークレットキーをワークステーションの安全な場所に保存する必要があります。Test Kitchen はインスタンスを作成するためにこれらの認証情報を使用します。Test Kitchen に認証情報を提供するには、ワークステーションの以下の環境変数にキーを割り当てることをお勧めします。
警告
IAM ユーザーには長期的な認証情報があり、セキュリティ上のリスクをもたらします。このリスクを軽減するために、これらのユーザーにはタスクの実行に必要な権限のみを付与し、不要になったユーザーを削除することをお勧めします。
-
AWS_ACCESS_KEY - ユーザーのアクセスキーは AKIAIOSFODNN7EXAMPLE のようなものです。
-
AWS_SECRET_KEY – ユーザーのシークレットキー。wJalrXUtnFEMI /K7MDENG/bPxRfiCYEXAMPLEKEY のようになります。
この手法によって、たとえば認証情報を含むプロジェクトを公開リポジトリにアップロードしてしまうなど不慮の事故でアカウントが侵害される機会が減ります。
クックブックをセットアップするには
-
kitchen-ec2
ドライバを使用するには、ruby-dev
パッケージがシステムにインストールされている必要があります。以下の例のコマンドでaptitude
を使用して Ubuntu システムでパッケージをインストールする方法を説明します。sudo aptitude install ruby1.9.1-dev
-
kitchen-ec2
ドライバは gem です。以下のようにインストールします。gem install kitchen-ec2
ワークステーションによっては、このコマンドで
sudo
が必要になる場合があります。また、RVMなどの Ruby 環境マネージャを使用することもできます。この手順は、 kitchen-ec2
ドライバーのバージョン 0.8.0 でテスト済みですが、より新しいバージョンがあります。特定のバージョンをインストールするには、 gem install kitchen-ec2 -v <
を実行します。version number
> -
Test Kitchen がインスタンスへの接続に使用できる Amazon EC2 SSH キーペアを指定する必要があります。Amazon EC2 キーペアがない場合、作成方法の詳細については、「Amazon EC2 キーペア」(Amazon EC2 キーペア) を参照してください。キーペアがインスタンスと同じ AWS リージョンに属している必要があることに注意してください。この例では、米国西部 (北カリフォルニア) を使用します。
キーペアを選択したら、
opsworks_cookbooks
のサブディレクトリec2_keys
を作成し、そのサブディレクトリにキーペアのプライベートキー (.pem
) ファイルをコピーします。ec2_keys
にプライベートキーを配置するのはコードをほんの少し簡素化する便宜上のものです。システムのどこに配置してもかまいません。 -
createdir-ec2
という名前のopsworks_cookbooks
のサブディレクトリを作成し、そのディレクトリに移動します。 -
createdir-ec2
に、次のコンテンツを含むmetadata.rb
ファイルを追加します。name "createdir-ec2" version "0.1.0"
-
「例 1: パッケージのインストール」に説明したように Test Kitchen を初期化します。以下のセクションでは
.kitchen.yml
を設定する方法を説明します。Amazon EC2 インスタンスでは際立って複雑です。 -
createdir-ec2
にrecipes
サブディレクトリを追加します。
Amazon EC2 用の .kitchen.yml の設定
kitchen-ec2
ドライバが適切に設定された Amazon EC2 インスタンスを起動するために必要な情報を使用して .kitchen.yml
を設定します。以下に示しているのは、米国西部 (北カリフォルニア) リージョンにある Amazon Linux インスタンス用の .kitchen.yml
ファイルの例です。
driver: name: ec2 aws_ssh_key_id: US-East1 region: us-west-1 availability_zone: us-west-1c require_chef_omnibus: true security_group_ids:
sg........
subnet_id:subnet-.........
associate_public_ip: true interface: dns provisioner: name: chef_solo platforms: -name: amazon driver: image_id:ami-xxxxxxxx
transport: username: ec2-user ssh_key: ../ec2_keys/US-East1.pem suites: - name: default run_list: - recipe[createdir-ec2::default] attributes:
provisioner
および suites
セクションにデフォルト設定を使用できますが、デフォルトの driver
と platforms
の設定は変更する必要があります。この例では、最小限の設定リストを使用して残りはデフォルト値を受け入れます。kitchen-ec2
設定の詳細なリストについては、「Kitchen::Ec2: Amazon EC2 用の Test Kitchen ドライバ
例では以下の driver
属性を設定します。前に説明したように、ユーザーのアクセスキーおよびシークレットキーは標準的な環境変数に割り当てられていることを前提とします。ドライバはこれらのキーをデフォルトで使用します。それ以外の場合、適切なキー値に設定した aws_access_key_id
および aws_secret_access_key
を driver
属性に追加して、明示的にキーを指定する必要があります。
- name
-
(必須) この属性は
ec2
に設定する必要があります。 - aws_ssh_key_id
-
(必須) Amazon EC2 SSH キーペア名です。この例では
US-East1
と名付けられます。 - transport.ssh_key
-
(必須)
aws_ssh_key_id
で指定したキーのプライベートキー (.pem
) ファイルです。US-East1.pem
属性は作業ディレクトリ (この例では../opsworks/ec2_keys
) を指定します。 - region
-
(必須) インスタンスの AWS リージョンです。この例では、
us-west-1
で表される米国西部 (北カリフォルニア) を使用しています。 - availability_zone
-
(オプション) インスタンスの利用可能ゾーンです。この設定を省略した場合、指定されたリージョン、米国西部 (北カリフォルニア)のデフォルトのアベイラビリティーゾーンの
us-west-1b
が Test Kitchen で使用されます。ただし、デフォルトのゾーンがお使いのアカウントでは使用できない場合があります。その場合は、明示的に利用可能ゾーンを指定する必要があります。ちょうど、この例を用意するために使用したアカウントはus-west-1b
をサポートしていないため、例では明示的にus-west-1c
を指定しています。 - require_chef_omnibus
-
true
に設定すると、この設定は、オムニバス形式のインストーラがchef-client
をすべてのプラットフォームインスタンスにインストールするときに必ず使用されるようにします。 - security_group_ids
-
(オプション) インスタンスに適用されるセキュリティグループ ID のリストです。この設定は、
default
セキュリティグループをそのインスタンスグループに適用します。セキュリティグループの進入ルールがインバウンド SSH 接続を許可していることを確認してください。許可されていないと Test Kitchen がインスタンスと通信できません。default
セキュリティグループを使用する場合、適宜編集する必要がある可能性があります。詳細については、「Amazon EC2 セキュリティグループ」を参照してください。 - subnet_id
-
インスタンスのターゲットサブネットの ID (該当する場合)。
- associate_public_ip
-
インターネットからインスタンスにアクセスできるようにする場合は、Amazon EC2 でインスタンスにパブリック IP アドレスを関連付けます。
- インターフェイスからリクエスト
-
インスタンスにアクセスするために使用したホスト名設定タイプ。有効な値は
dns
、public
、private
、またはprivate_dns
です。この属性の値を指定しない場合、kitchen-ec2
は次の順序でホスト名設定を指定します。この属性を省略すると、設定タイプが設定されていません。-
[DNS 名]
-
パブリック IP アドレス
-
プライベート IP アドレス
-
プライベート DNS 名
-
重要
アクセスキーとシークレットキーにアカウントの認証情報を使用するよりも、ユーザーを作成してその認証情報を Test Kitchen に提供することをお勧めします。詳細については、「AWS アクセスキーを管理するためのベストプラクティス」を参照してください。
パブリック GitHub リポジトリや Bitbucket リポジトリにアップロードするなど、パブリックにアクセス可能な場所に .kitchen.yml
を配置しないように注意してください。ご自分の認証情報が公開され、アカウントのセキュリティが侵害される恐れがあります。
kitchen-ec2
ドライバは以下のプラットフォームをデフォルトでサポートします。
-
Ubuntu-10.04
-
Ubuntu-12.04
-
Ubuntu-12.10
-
Ubuntu-13.04
-
Ubuntu-13.10
-
Ubuntu-14.04
-
CentOS 6.4
-
Debian-7.1.0
-
windows-2012r2
-
windows-2008r2
これらのプラットフォームを 1 つ以上使用する場合は、適切なプラットフォーム名を platforms
に追加します。kitchen-ec2
ドライバは自動的に適切な AMI を選択し、SSH ユーザー名を生成します。他のプラットフォーム (この例では Amazon Linux を使用) を使用できますが、以下の platforms
属性を明確に指定する必要があります。
- name
-
プラットフォーム名。この例では Amazon Linux を使用しているので、
name
はamazon
に設定します。 - ドライバー
-
driver
属性です。以下のものが含まれます。-
image_id
- プラットフォームの AMI です。指定したリージョンに属している必要があります。この例では、米国西部 (北カリフォルニア) リージョンの Amazon Linux AMIであるami-ed8e9284
を使用します。 -
transport.username
- SSH ユーザー名です。Test Kitchen がインスタンスとの通信に使用します。Amazon Linux には
ec2-user
を使用します。その他の AMI では別のユーザー名になる場合があります。
-
.kitchen.yml
のコードを例で置き換え、aws_access_key_id
などのアカウント固有の属性に適切な値を割り当てます。
レシピの実行
この例では、「イテレーション」のレシピを使用します。
レシピを実行するには
-
以下のコードとともに
default.rb
という名前のファイルを作成してクックブックのrecipes
フォルダに保存します。directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end
-
kitchen converge
を実行してレシピを実行します。このコマンドは、Amazon EC2 インスタンスを起動および初期化に時間がかかるため、これまでの例よりも時間がかかることに注意してください。 -
[Amazon EC2 console]
(Amazon EC2 コンソール) に移動し、米国西部 (北カリフォルニア) リージョンを選択して、ナビゲーションペインで [Instances] (インスタンス) をクリックします。リストに新しく作成されたインスタンスが表示されます。 -
で実行中のインスタンスの場合と同様に、
kitchen login
を実行してインスタンスにログインします VirtualBox。/srv
の下に新しく作成したディレクトリがあるはずです。お好きな SSH クライアントを使用してインスタンスに接続することもできます。