AnsibleでAWS操作　S3バケット編

# AnsibleでAWS操作シリーズ

1. [aws-cliインストール編](http://qiita.com/bakira/items/d94fc79a032b117bf87f)
1. [EC2インスタンス編](http://qiita.com/bakira/items/ae56e8e03eed4dc75a01)
1. S3バケット編
1. [CloudFrontディストリビューション編](http://qiita.com/bakira/items/611e3a51677b751f8366)
1. [Simple Email Service編](http://qiita.com/bakira/items/8147fcc7cb684beedc63)
1. [Certificate Manager編](http://qiita.com/bakira/items/50bdd853ce71953e1600)
1. [Lambda編](https://qiita.com/bakira/items/d55c91328cd1f0ee9581)

# 関連記事

[aws-cli　コマンド一覧(随時追記)](http://qiita.com/bakira/items/8a9481c99ed56a367415)

# やりたかったこと

- S3バケットの作成/削除
- S3バケットへのオブジェクトの転送/削除
- S3バケットを静的Webサイトホスティング化
- ~~GUIを使わずに黒い画面でコマンドを「**ッターーン!**」してかっこつけたい~~

# やったこと

## 前提

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

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

## 作業フロー
### 1. S3バケットを新規作成

```bash:command
ansible-playbook -i inventory/production create-aws-s3-bucket.yml
```

### 2. S3バケットをWebサイトホスティング化

```bash:command
ansible-playbook -i inventory/production setup-aws-s3-bucket.yml
```

### 3. オブジェクトを転送

```bash:command
ansible-playbook -i inventory/production upload-aws-s3-object.yml
```

### 4. オブジェクトの転送確認

```bash:command
ansible-playbook -i inventory/production view-aws-s3-object.yml
```

### 5. オブジェクトの削除

```bash:command
ansible-playbook -i inventory/production delete-aws-s3-object.yml
```

### 6. バケットの削除

```bash:command
ansible-playbook -i inventory/production delete-aws-s3-bucket.yml
```

## ディレクトリ構成
```text

├── ansible.cfg
├── create-aws-s3-bucket.yml
├── delete-aws-s3-bucket.yml
├── delete-aws-s3-object.yml
├── files
│   └── production
│       └── s3
│           └── sample.txt
├── inventory
│   └── production
│       └── inventory
├── roles
│   ├── create-aws-s3-bucket
│   │   └── tasks
│   │       └── main.yml
│   ├── delete-aws-s3-bucket.yml
│   │   └── tasks
│   │       └── main.yml
│   ├── delete-aws-s3-object.yml
│   │   └── tasks
│   │       └── main.yml
│   ├── setup-aws-s3-bucket.yml
│   │   └── tasks
│   │       └── main.yml
│   ├── upload-aws-s3-bucket.yml
│   │   └── tasks
│   │       └── main.yml
│   └── view-aws-s3-object.yml
│       └── tasks
│           └── main.yml
├── upload-aws-s3-object.yml
├── setup-aws-s3-bucket.yml
├── vars
│   └── all.yml
└── view-aws-s3-object.yml
```

## Ansible構成ファイル

### inventory

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

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

[all:vars]
ENV=production

```

### vars

```yaml:vars/all.yml
AWS:
  S3:
    BUCKET:
      NAME: ${バケット名}
```


### playbook

```yaml:create-aws-s3-bucket
- hosts: cliservers
  roles:
    - create-aws-s3-bucket
  vars_files:
    - vars/all.yml
```

```yaml:delete-aws-s3-bucket
- hosts: cliservers
  roles:
    - delete-aws-s3-bucket
  vars_files:
    - vars/all.yml
```

```yaml:delete-aws-s3-object
- hosts: cliservers
  roles:
    - delete-aws-s3-object
  vars_files:
    - vars/all.yml
```

```yaml:setup-aws-s3-bucket
- hosts: cliservers
  roles:
    - setup-aws-s3-bucekt
  vars_files:
    - vars/all.yml
```

```yaml:upload-aws-s3-object
- hosts: cliservers
  roles:
    - update-aws-s3-bucket
  vars_files:
    - vars/all.yml
```

```yaml:view-aws-s3-object
- hosts: cliservers
  roles:
    - view-aws-s3-object
  vars_files:
    - vars/all.yml
```

### tasks

```yaml:role/create-aws-s3-bucket/tasks/main.yml
- name: Create Bucket
  shell: "aws s3 mb s3://{{ AWS.S3.BUCKET.NAME }}"
  register: result
  changed_when: False

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

```yaml:role/delete-aws-s3-bucket/tasks/main.yml
- name: "Remove Bucket"
  shell: "aws s3 rb s3://{{ AWS.S3.BUCKET.NAME }}"
  register: result
  changed_when: False

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

```yaml:role/delete-aws-s3-bucket/tasks/main.yml
- name: "Delete Bucket"
  shell: "aws s3 rb s3://{{ AWS.S3.BUCKET.NAME }}"
  register: result
  changed_when: False

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

```yaml:role/delete-aws-s3-object/tasks/main.yml
- name: "Delete Object"
  shell: "aws s3 rm s3://{{ AWS.S3.BUCKET.NAME }}/sample.txt"
  register: result
  changed_when: False

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

```yaml:role/setup-aws-s3-bucket/tasks/main.yml
- name: "Setup Bucket"
  shell: |
    aws s3 website s3://{{ AWS.S3.BUCKET.NAME }} \
    --index-document index.html
  register: result
  changed_when: False

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

```yaml:role/upload-aws-s3-object/tasks/main.yml
- name: "Upload Object"
  shell: "aws s3 cp files/{{ ENV }}/s3/sample.txt s3://{{ AWS.S3.BUCKET.NAME }}"
  register: result
  changed_when: False

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

```yaml:role/view-aws-s3-object/tasks/main.yml
- name: "View Objects"
  shell: "aws s3 ls s3://{{ AWS.S3.BUCKET.NAME }}"
  register: result
  changed_when: False

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

## 終わりに

`S3`のバケット作成やファイル操作も **簡単** に行うことが可能で、 **静的サイト** として利用する場合のためのindexドキュメントの指定などのオプションもあります。

また、今回は触れませんでしたが転送したファイル単位で **パーミッション** の設定も出来るので柔軟性もあります。

また、`CloudFront`と組み合わせればキャッシュを有効利用してパフォーマンス向上を図ることも可能です。

`S3`バケットは **静的コンテンツのホスティング** や **簡易ファイルサーバー** 、 **Wordpressの記事をhtml化** したりとかなり汎用性が高く、 **料金もかなり良心的** なのでどんどん利用していきましょう♪

じゃあの。