
Ansibleを活用してAWS上にインフラ環境を自動構築 | Playbookを使ってリソースをデプロイする方法
Red Hatが開発したオープンソースのIT自動化ツール「Ansible(アンシブル)」は、インフラ構築、構成管理、アプリケーションのデプロイ、オーケストレーションなど、様々なITプロセスを自動化するために使用されます。Ansibleを活用すれば、AWSリソースの構築や管理を効率化できます。
本記事では、VPCやサブネット、Amazon EC2インスタンスなどのAWSリソースをPlaybookで自動構築する手順を詳しく解説します。また、構築後の環境削除方法も紹介。別記事で解説しているAnsibleやAWS CLIの基本操作を活用しながら、実践的なAWSインフラ管理を学びましょう。
AnsibleでAWSリソースを管理するメリット
Ansibleを使えば、AWSリソースの構築とサーバー設定を1つのツールで一元管理できます。また、Playbookを利用してリソース管理をコード化することで、再利用性や運用効率を大幅に向上させることが可能です。
クラウド構成とサーバー設定を同じツールで管理できる
Ansibleは、クラウドリソースの構築とサーバー設定を1つのツールで管理できる点が最大の強みです。
たとえば、VPCやサブネット、セキュリティグループ、EC2インスタンスといったAWSリソースを構築するPlaybookと、構築したインスタンス内でApacheやNginxのインストールなどのサーバー設定を行うPlaybookを組み合わせて使用できます。
リソース構築と構成管理を別々のツールで行う必要がなくなり、一貫性のある管理が実現します。
Playbookを使った再利用性の高いインフラ管理
AnsibleのPlaybookは、再利用可能なインフラ管理のコードとして非常に便利です。
一度作成したPlaybookは、他のプロジェクトや異なる環境(開発環境、本番環境など)でもそのまま使用できます。
さらに、Ansible Rolesを活用することで、Playbookをモジュール化し、管理対象を分けることも可能です。
AWS CLIやSDKを使わずに構築を自動化
通常、AWSリソースの構築や管理にはAWS CLIやSDKを使用しますが、Ansibleを利用すれば、コードやコマンドを細かく記述する必要がありません。
たとえば、EC2インスタンスの作成やVPCの設定は、AnsibleのPlaybook内にシンプルに記述できます。
さらに、Ansibleは冪等性(べきとうせい)を持つため、既に適用された設定はスキップされ、リソースの状態を常に整合性のあるものに保てます。
AnsibleでAWS上にリソースを自動構築させる手順

Ansibleを活用してAWSリソースを自動構築する手順は、大きく以下の4つのステップに分けられます。
- 必要なツールの準備(Ansible、AWS CLI、Ansibleコレクション)
Ansible、AWS CLI、Ansibleコレクションなどの必要なツールを準備します。 - Playbookを作成し、AWSリソース(EC2インスタンスなど)を定義
AWSリソースを構築するPlaybookを作成します - Playbookを実行してAWSリソースを構築
作成したPlaybookを実行してAWSリソースを自動的に構築します。
実行後、AWSリソースが正しく構築されたか、AWSマネジメントコンソールで確認します。冪等性を活用することで、何度でも同じ構成を適用可能です。 - Playbookを実施してAWS環境を削除
構築したAWSリソースを削除するために専用のPlaybookを作成し、実行します。
それでは実践していきましょう。
使用するツールの準備
Ansibleのインストール
Ansibleは、構成管理や自動化を実現するためのツールです。インストール方法は、OSによって異なりますが、以下のコマンドで簡単にインストールできます。
macOSの場合
brew install ansible |
Linuxの場合
sudo apt update sudo apt install ansible -y |
Python経由でのインストール
pip3 install ansible |
Ansibleのインストールについて詳しく知りたい方は、こちらの記事(Ansibleインストール内部リンク)をご参照ください。
AWSの権限とポリシー付与
AnsibleでAWSリソースを管理するために、適切な権限を持つIAMユーザーを作成します。
- AWSマネジメントコンソールでIAMユーザーを作成
- 必要なポリシー(例: AmazonEC2FullAccess)をアタッチ
- アクセスキーとシークレットキーを取得し、AWS CLIに設定
AWS CLIのセットアップ
AWS CLIを使って、AnsibleとAWSの連携を行います。
AWS CLIをインストールします(例: macOS)
brew install awscli |
インストールが完了したら、以下のコマンドでAWS CLIのバージョンを確認します。
aws –version |
AWS CLIを設定します。
aws configure |
AWS CLIのインストールとセットアップ方法は、以下の記事の見出し「事前準備」の章にて詳しく解説しています。
AWS用のAnsibleコレクション(amazon.aws)のインストール
AWSリソースを管理するために必要なモジュールが含まれるamazon.awsコレクションをインストールします。以下のコマンドを実行してください。
ansible-galaxy collection install amazon.aws |
これにより、AnsibleがAWSリソースを操作するためのモジュール(例: ec2_instance)を利用可能になります。
以上で事前準備は完了です。
それでは、学習用Ansibleプロジェクトのディレクトリ構造を準備します。以下の構造を参考に作成してください。
ansible_project/ # プロジェクトのルートディレクトリ ├── inventory/ # インベントリファイルを格納 │ └── inventory.ini # インベントリファイル(ホスト情報) ├── roles/ # Rolesを格納 │ └── (必要に応じてRolesを追加) ├── vars/ # 追加の変数定義ディレクトリ │ └── common.yml # 共通変数を定義 └── aws_playbook.yml # AWSリソースを構築するPlaybook |
2. インベントリファイルを作成する
インベントリファイルは、以下のような形式で記述します。今回の例では、まだEC2インスタンスが作成されていない状態なので、仮の構成を記載します。
inventory/inventory.ini
[target] # 仮のプライベートIPアドレスを記載 10.0.1.100 ansible_user=ec2-user ansible_private_key_file=~/.ssh/id_rsa [all:vars] ansible_python_interpreter=/usr/bin/python3 |
[target]: グループ名。対象ノードをまとめて管理します。
ansible_user: EC2インスタンスに接続する際のユーザー名(Amazon Linux 2の場合、ec2-user)。
ansible_private_key_file: SSH接続で使用する秘密鍵のパス。
[all:vars]: すべての対象ノードで共通の設定。ここではPythonのインタープリタを指定しています。
構築後の修正
AWSリソースを構築した後、インベントリファイルを動的に更新する必要があります。例えば、構築したEC2インスタンスのプライベートIPをインベントリファイルに反映します。
修正例:実際は構築したEC2のプライベートIPを記載してください。
[target] 10.0.1.101 ansible_user=ec2-user ansible_private_key_file=~/.ssh/id_rsa [all:vars] ansible_python_interpreter=/usr/bin/python3 |
今回は使用しませんが、インベントリファイルは手動で編集するだけでなく、dynamic inventoryを利用して自動化することも可能です。
3. AWS自動構築のPlaybookを作成する
AWSリソースを自動構築するために、AnsibleのPlaybookを作成します。
Playbookは、Ansibleが対象ノードに実行するタスクを定義するYAML形式のファイルです。今回作成するPlaybookの目的は、以下のリソースをAWS上に自動構築することです。
- VPCの作成
- サブネットの作成
- セキュリティグループの作成
- EC2インスタンスの作成
AWSモジュールの利用
AWSリソースを構築する際、Ansibleのamazon.awsコレクションに含まれるモジュールを使用します。以下は主要なモジュールの概要です。
- amazon.aws.ec2_vpc_net: VPCを作成。
- amazon.aws.ec2_vpc_subnet: サブネットを作成。
- amazon.aws.ec2_security_group: セキュリティグループを作成。
- amazon.aws.ec2_instance: EC2インスタンスを作成。
これらのモジュールを利用してPlaybookを記述します。
aws_playbook.yml
— – name: Create AWS infrastructure hosts: localhost connection: local tasks: # VPCの作成 – name: Create a VPC amazon.aws.ec2_vpc_net: name: my-vpc cidr_block: 10.0.0.0/16 state: present tags: Name: my-vpc register: vpc # 複数サブネットの作成 – name: Create multiple subnets amazon.aws.ec2_vpc_subnet: vpc_id: “{{ vpc.vpc.id }}” cidr: “{{ item.cidr_block }}” az: “{{ item.availability_zone }}” state: present tags: Name: “{{ item.name }}” loop: – { name: “subnet-public-1”, cidr_block: “10.0.1.0/24”, availability_zone: “ap-northeast-1a” } – { name: “subnet-public-2”, cidr_block: “10.0.2.0/24”, availability_zone: “ap-northeast-1c” } register: subnets # セキュリティグループの作成 – name: Create a security group amazon.aws.ec2_security_group: name: my-security-group description: Allow SSH and HTTP traffic vpc_id: “{{ vpc.vpc.id }}” rules: – proto: tcp from_port: 22 to_port: 22 cidr_ip: 0.0.0.0/0 – proto: tcp from_port: 80 to_port: 80 cidr_ip: 0.0.0.0/0 state: present register: security_group # 複数のEC2インスタンスを動的に作成 – name: Launch multiple EC2 instances amazon.aws.ec2_instance: name: “{{ item.name }}” instance_type: “{{ item.instance_type }}” image_id: “{{ item.image_id }}” key_name: “{{ item.key_name }}” network: vpc_id: “{{ vpc.vpc.id }}” subnet_id: “{{ subnets.results[0].subnet.id }}” # 最初のサブネットを使用 assign_public_ip: false security_groups: “{{ security_group.security_group.name }}” state: present loop: – { name: “app-server-1”, instance_type: “t2.micro”, image_id: “ami-075cc63e37ba74823”, key_name: “my-key” } – { name: “app-server-2”, instance_type: “t2.micro”, image_id: “ami-075cc63e37ba74823”, key_name: “my-key” } register: ec2_instances # 作成したインスタンス情報の表示 – name: Display created EC2 instances debug: msg: “Instance {{ item.instances[0].id }} with IP {{ item.instances[0].private_ip_address }}” loop: “{{ ec2_instances.results }}” |
Playbookの説明
hosts: localhost: Playbookはローカルマシン上で実行されます。
connection: local: AWS CLIを使用してAWSに接続するため、ローカル接続を指定。
register: モジュールの出力を変数として保存し、後続のタスクで利用。
amazon.aws.*モジュール: 各AWSリソースの作成に使用。
動的な複数リソースを定義する
作成したPlaybookの主要部分を解説します。Playbook内でリソースを動的に作成するために、以下のAnsible機能を使用します。
・ループ処理(loop): 同じタスクを複数回実行し、それぞれ異なるリソースを作成します。
・変数とテンプレート: リソースのパラメータ(名前やCIDRブロックなど)を変数として定義し、柔軟性を持たせます。
・registerとloop: 作成したリソース情報をregisterで取得し、次のタスクで利用可能にします。
サブネット作成のループ例:
– name: Create multiple subnets amazon.aws.ec2_vpc_subnet: vpc_id: “{{ vpc.vpc.id }}” cidr: “{{ item.cidr_block }}” az: “{{ item.availability_zone }}” state: present tags: Name: “{{ item.name }}” loop: – { name: “subnet-public-1”, cidr_block: “10.0.1.0/24”, availability_zone: “ap-northeast-1a” } – { name: “subnet-public-2”, cidr_block: “10.0.2.0/24”, availability_zone: “ap-northeast-1c” } register: subnets |
loop: サブネットの名前、CIDRブロック、可用性ゾーンを個別に指定できます。
register: 作成されたサブネット情報をsubnets変数に保存。
EC2インスタンス作成のループ例:
– name: Launch multiple EC2 instances amazon.aws.ec2_instance: name: “{{ item.name }}” instance_type: “{{ item.instance_type }}” image_id: “{{ item.image_id }}” key_name: “{{ item.key_name }}” network: vpc_id: “{{ vpc.vpc.id }}” subnet_id: “{{ subnets.results[0].subnet.id }}” # 最初のサブネットを指定 assign_public_ip: false security_groups: “{{ security_group.security_group.name }}” state: present loop: – { name: “app-server-1”, instance_type: “t2.micro”, image_id: “ami-075cc63e37ba74823”, key_name: “my-key” } – { name: “app-server-2”, instance_type: “t2.micro”, image_id: “ami-075cc63e37ba74823”, key_name: “my-key” } register: ec2_instances |
loop: インスタンスごとに異なるパラメータを指定。
register: 作成されたインスタンス情報を保存。
4. 変数を定義する
Playbook内で柔軟にAWSリソースを構築するために、変数を定義します。プロジェクトのvars/ディレクトリに、変数を定義するYAMLファイルを作成します。
vars/main.yml
— vpc_cidr: “10.0.0.0/16” subnets: – { name: “subnet-public-1”, cidr_block: “10.0.1.0/24”, availability_zone: “ap-northeast-1a” } – { name: “subnet-public-2”, cidr_block: “10.0.2.0/24”, availability_zone: “ap-northeast-1c” } security_group_name: “my-security-group” security_group_description: “Allow SSH and HTTP traffic” ec2_instances: – { name: “app-server-1”, instance_type: “t2.micro”, image_id: “ami-075cc63e37ba74823”, key_name: “my-key” } – { name: “app-server-2”, instance_type: “t2.micro”, image_id: “ami-075cc63e37ba74823”, key_name: “my-key” } |
Playbookで変数を読み込む
変数ファイルをPlaybookで読み込むには、以下のようにvars_filesを使用します。
aws_playbook.yml
— – name: Create AWS infrastructure hosts: localhost connection: local vars_files: – vars/main.yml # 変数ファイルを指定 tasks: – name: Create a VPC amazon.aws.ec2_vpc_net: name: my-vpc cidr_block: “{{ vpc_cidr }}” state: present tags: Name: my-vpc register: vpc 以下略 |
5. Playbookの実行
作成したPlaybook(aws_playbook.yml)を実行するには、以下のコマンドを使用します。
ansible-playbook -i inventory.ini aws_playbook.yml |
Playbookを実行すると、以下のような出力がターミナルに表示されます。
PLAY [Create AWS infrastructure] ******************************************************************* TASK [Gathering Facts] **************************************************************************** ok: [localhost] TASK [Create a VPC] ****************************************************************************** changed: [localhost] TASK [Create multiple subnets] ******************************************************************* changed: [localhost] TASK [Create a security group] ******************************************************************* changed: [localhost] TASK [Launch multiple EC2 instances] ************************************************************* changed: [localhost] TASK [Display created EC2 instances] ************************************************************* ok: [localhost] => (item={‘instances’: [{‘id’: ‘i-0a1234567890b1234’, ‘private_ip_address’: ‘10.0.1.101’}]}) PLAY RECAP *************************************************************************************** localhost : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
AWSマネジメントコンソールで確認
Playbookの実行が完了したら、AWSマネジメントコンソールにログインして、以下のリソースが作成されていることを確認してください。
- VPC: my-vpcという名前のVPCが作成されているか。
- サブネット: subnet-public-1とsubnet-public-2のサブネットがVPC内に作成されているか。
- セキュリティグループ: my-security-groupが正しく作成されているか。
- EC2インスタンス: app-server-1とapp-server-2という名前のインスタンスが起動しているか。


冪等性の確認
AnsibleのPlaybookは冪等性(べきとうせい)を持つため、再度Playbookを実行しても同じ構成が維持されます。出力は以下のようになり、「changed」の数が0になることを確認できます。
PLAY [Create AWS infrastructure] ******************************************************************* TASK [Gathering Facts] **************************************************************************** ok: [localhost] TASK [Create a VPC] ****************************************************************************** ok: [localhost] TASK [Create multiple subnets] ******************************************************************* ok: [localhost] TASK [Create a security group] ******************************************************************* ok: [localhost] TASK [Launch multiple EC2 instances] ************************************************************* ok: [localhost] TASK [Display created EC2 instances] ************************************************************* ok: [localhost] => (item={‘instances’: [{‘id’: ‘i-0a1234567890b1234’, ‘private_ip_address’: ‘10.0.1.101’}]}) PLAY RECAP *************************************************************************************** localhost : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
6. 環境の削除
構築したAWSリソース(VPC、サブネット、セキュリティグループ、EC2インスタンス)を削除するために、以下の削除用Playbookを作成します。これを例えばdelete_aws_playbook.ymlという名前で保存してください。
delete_aws_playbook.yml
— – name: Delete AWS infrastructure hosts: localhost connection: local tasks: # EC2インスタンスの削除 – name: Terminate EC2 instances amazon.aws.ec2_instance: state: absent ids: “{{ item.instances[0].id }}” wait: yes loop: “{{ ec2_instances.results }}” when: ec2_instances is defined and ec2_instances.results is defined # セキュリティグループの削除 – name: Delete the security group amazon.aws.ec2_security_group: state: absent group_id: “{{ security_group.group_id }}” when: security_group is defined and security_group.group_id is defined # サブネットの削除 – name: Delete subnets amazon.aws.ec2_vpc_subnet: state: absent id: “{{ item.subnet.id }}” loop: “{{ subnets.results }}” when: subnets is defined and subnets.results is defined # VPCの削除 – name: Delete the VPC amazon.aws.ec2_vpc_net: state: absent vpc_id: “{{ vpc.vpc.id }}” when: vpc is defined and vpc.vpc.id is defined |
以下のコマンドを使用して、削除用Playbookを実行します。
ansible-playbook -i inventory/inventory.ini delete_aws_playbook.yml |
AWSリソースの削除を確認
削除用Playbookの実行後、AWSマネジメントコンソールにログインして、以下の項目が削除されていることを確認してください。
- EC2インスタンスが削除されているか。
- セキュリティグループが削除されているか。
- サブネットが削除されているか。
- VPCが削除されているか。
まとめ
本記事では、Ansibleを活用してAWS上にVPC、サブネット、セキュリティグループ、EC2インスタンスを自動構築・管理する手順を解説しました。Playbookを用いることで、リソースの一元管理や再利用が可能となり、運用効率が大幅に向上します。
また、冪等性によりリソース状態を一定に保つことができ、安定した環境構築が実現します。さらに削除用Playbookを活用することで、不要なリソースを効率的に削除しコスト削減も可能です。
次はRolesや他のAWSサービスにも挑戦していきましょう。気になる方はぜひご覧ください。