13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AnsibleでAWS操作 EC2インスタンス編

Last updated at Posted at 2017-07-28

AnsibleでAWS操作シリーズ

  1. aws-cliインストール編
  2. EC2インスタンス編
  3. S3バケット編
  4. CloudFrontディストリビューション編
  5. Simple Email Service編
  6. Certificate Manager編
  7. Lambda編

関連記事

aws-cli コマンド一覧(随時追記)

やりたかったこと

  • EC2インスタンスに紐付けるSecurityGroupの作成/設定
  • EC2インスタンスに紐付けるElastic IPの作成/設定/削除
  • EC2インスタンスの作成/削除
  • Elastic IPの関連付け
  • GUIを使わずに黒い画面でコマンドを「ッターーン!」してかっこつけたい

やったこと

前提

  • CIサーバー(ansible実行サーバー)構築済み
  • CLIサーバー(aws-cli実行サーバー)構築済み
  • Ansibleインストール済み
  • aws-cliインストール済み
  • jqインストール済み
  • 各サーバーへのSSH接続設定済み

${~}は各環境に合わせて値を設定してください。

作業フロー

  1. SSH用のセキュリティグループを新規作成
command
ansible-playbook -i inventory/production create-aws-ec2-ssh-security-group.yml
  • 戻り値のGroupIdの値をvars/all.ymlのSECURITY_GROUP_IDに指定
  1. EC2インスタンスを新規作成
command
ansible-playbook -i inventory/production create-aws-ec2-instance.yml
  • 戻り値のInstanceIdAllocationIdをそれぞれINSTANCE_IDELASTIC_IP_IDに指定
  1. EC2インスタンスの初期設定
command
ansible-playbook -i inventory/production setup-aws-ec2-instance.yml

jqで取得した各種IDを使って一つのtaskでやろうと思いましたが、Instance作成直後はElasticIPの紐付けが出来ないっぽいので、playbookを分けています。

ディレクトリ構成


├── ansible.cfg
├── create-aws-ec2-instance.yml
├── create-aws-ec2-ssh-security-group.yml
├── inventory
│   └── production
│       └── inventory
├── roles
│   ├── create-aws-ec2-elastic-ip
│   │   └── tasks
│   │       └── main.yml
│   ├── create-aws-ec2-instance
│   │   └── tasks
│   │       └── main.yml
│   ├── create-aws-ec2-ssh-security-group
│   │   └── tasks
│   │       └── main.yml
│   ├── setup-aws-ec2-elastic-ip
│   │   └── tasks
│   │       └── main.yml
│   └── setup-aws-ec2-instance
│       └── tasks
│           └── main.yml
├── setup-aws-ec2-instance.yml
├── vars
│   └── all.yml
└── view-aws-ec2-instance.yml

Ansible構成ファイル

inventory

inventory/production/inventory
[ciservers]
${CIサーバーホスト}

[cliservers]
${CLIサーバーホスト}

[all:vars]
ENV=production

vars

vars/all.yml
AWS_EC2:
  SECURITY_GROUP_ID: ${セキュリティグループID}
  SECURITY_GROUP_NAME: ${セキュリティグループ名}
  SECURITY_GROUP_DESCRIPTION: ${セキュリティグループ概要}
  IP_ADDRESS: ${IPアドレス}
  KEY_PAIR_NAME: ${キーペア名}
  AMI_ID: ${AMI ID}
  INSTANCE_TYPE: ${インスタンスタイプ}
  INSTANCE_ID: ${インスタンスID}
  INSTANCE_NAME: ${インスタンス名}
  ALLOCATION_ID: ${Elastic IP ID}

playbook

create-aws-ec2-ssh-security-group.yml
- hosts: cliservers
  roles:
    - create-aws-ec2-ssh-security-group
  vars_files:
    - vars/all.yml
create-aws-ec2-instance.yml
- hosts: cliservers
  roles:
    - create-aws-ec2-instance
    - create-aws-ec2-elastic-ip
  vars_files:
    - vars/all.yml
setup-aws-ec2-instance.yml
- hosts: cliservers
  roles:
    - setup-aws-ec2-instance
    - setup-aws-ec2-elastic-ip
  vars_files:
    - vars/all.yml

tasks

role/create-aws-ec2-ssh-security-group/tasks/main.yml
- name: "Create SSH Security Group"
  shell: |
    aws ec2 create-security-group \
    --group-name {{ AWS_EC2.SECURITY_GROUP_NAME }} \
    --description '{{ AWS_EC2.SECURITY_GROUP_DESCRIPTION }}'
  register: result
  changed_when: False

- debug: var=result.stdout_lines
  when: result | success
  tags:
    - always

- name: "Setup SSH Security Group"
  shell: |
    aws ec2 authorize-security-group-ingress \
    --group-name {{ AWS_EC2.SECURITY_GROUP_NAME }} \
    --protocol tcp \
    --port 22 \
    --cidr "{{ AWS_EC2.IP_ADDRESS }}/0" \
    | jq '.'
  tags:
    - always
role/create-aws-ec2-instance/tasks/main.yml
- name: "Create Instanse"
  shell: |
    aws ec2 run-instances \
    --image-id {{ AWS_EC2.AMI_ID }} \
    --count 1 \
    --instance-type {{ AWS_EC2.INSTANCE_TYPE }}  \
    --key-name {{ AWS_EC2.KEY_PAIR_NAME }} \
    --security-groups {{ AWS_EC2.SECURITY_GROUP_NAME }} \
    | jq -r '.Instances[] | { InstanceId }'
  register: create_instance_result
  changed_when: False

- debug: var=create_instance_result.stdout_lines
  when: create_instance_result | success
  tags:
    - always
role/create-aws-ec2-elastic-ip/tasks/main.yml
- name: "Create Elastic IP"
  shell: |
    aws ec2 allocate-address \
    --domain vpc \
    | jq -r '{ AWS_EC2.ALLOCATION_ID }'
  register: result
  changed_when: False

- debug: var=result.stdout_lines
  when: result | success
  tags:
    - always
role/setup-aws-ec2-instance/tasks/main.yml
- name: "Create Tags"
  shell: |
    aws ec2 create-tags \
    --resources {{ AWS_EC2.INSTANCE_ID }} \
    --tags Key=Name,Value={{ AWS_EC2.INSTANCE_NAME }}
  register: result
  changed_when: False

- debug: var=result.stdout_lines # stdout => stdout_lines
  when: result | success
  tags:
    - always

role/setup-aws-ec2-elastic-ip/tasks/main.yml
- name: "Setup Elastic IP"
  shell: |
    aws ec2 associate-address \
    --allocation-id {{ AWS_EC2.ALLOCATION_ID }} \
    --instance {{ AWS_EC2.INSTANCE_ID }}
  register: result
  changed_when: False

- debug: var=result.stdout_lines # stdout => stdout_lines
  when: result | success
  tags:
    - always

正常に処理が終了したらインストール編で実行したplaybookを実行してみてください。
インスタンス一覧取得playbook

新しいインスタンスの情報が取得出来るはずです。

おまけ インスタンス及びElasticIPの削除

delete-aws-ec2-instance.yml
- hosts: cliservers
  roles:
    - delete-aws-ec2-instance
    - delete-aws-ec2-elastic-ip
  vars_files:
    - vars/all.yml

tasks

role/delete-aws-ec2-instance/tasks/main.yml
- name: "Delete EC2 Instanse"
  shell: |
    aws ec2 terminate-instances \
    --instance-ids {{ AWS_EC2.INSTANCE_ID }}
  register: result
  changed_when: False

- debug: var=result.stdout_lines # stdout => stdout_lines
  when: result | success
  tags:
    - always
role/delete-aws-ec2-instance/tasks/main.yml
- name: "Delete Elastic IP"
  shell: |
    aws ec2 release-address \
    --allocation-id {{ AWS_EC2.ALLOCATION_ID }}
  register: result
  changed_when: False

- debug: var=result.stdout_lines # stdout => stdout_lines
  when: result | success
  tags:
    - always
command
ansible-playbook -i inventory/production delete-aws-ec2-instance.yml

終わりに

インスタンスの作成や関連する設定もCLIから実行することが出来ます。
さらに各種設定値等もファイル内に残るので管理がしやすいです!

じゃあの。

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?