キーワードで検索

今日を知り、明日を変えるシステム運用メディア

Ansibleを活用してAWS上にインフラ環境を自動構築 | Playbookを使ってリソースをデプロイ

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つのステップに分けられます。

  1. 必要なツールの準備(Ansible、AWS CLI、Ansibleコレクション)
    Ansible、AWS CLI、Ansibleコレクションなどの必要なツールを準備します。
  2. Playbookを作成し、AWSリソース(EC2インスタンスなど)を定義
    AWSリソースを構築するPlaybookを作成します
  3. Playbookを実行してAWSリソースを構築
    作成したPlaybookを実行してAWSリソースを自動的に構築します。
    実行後、AWSリソースが正しく構築されたか、AWSマネジメントコンソールで確認します。冪等性を活用することで、何度でも同じ構成を適用可能です。
  4. 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サービスにも挑戦していきましょう。気になる方はぜひご覧ください。

現在クラウドエンジニアとして勤務。AWS(SAP、DOP)とAzure(AZ-305)の資格を保有しており、ネットワークやセキュリティに関する業務を主に行っています。

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録