はじめに
最近勉強がてら「AWS Hands-on for Beginners」の「AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!」を視聴し、自分でもCI/CDの環境を構築してみたいと思ったので、前回手放しでおすすめできるとは言い難いと記事に書いておきながらも、Systems ManagerからAnsible実行機能を使って、CodeCommitにAnsible実行用のソースをコミットしたら指定のインスタンスに対してAnsibleを実行する環境を構築してみたいと思います。
- 【関連1】Amazon S3からのスクリプトの実行をやってみた。
- 【関連2】SSM Agentの実行スクリプトを削除する方法
- 【関連3】Systems Managerでベストプラクティス構成のPlaybook運用する場合に注意すること
最終的な構成
今回から数回に分け、以下のような構成を構築してみようと思います。
Systems ManagerからのAnsible実行について
Systems ManagerのRunCommand実行機能の一つで、対象となるノードに対してansible-playbookを実行できる機能となります。
1ファイル構成のplaybook実行と、いわゆるベストプラクティス構成となるplaybookの実行それぞれに対応しているため、すでにAnsibleを使って運用している環境であれば、比較的スムーズに移行することが可能です。
Systems ManagerでRunCommand機能を使った場合の動作や仕組みなどについては上記【関連1】で説明しているため、そちらを参照してください。
Systems ManagerでRunCommand機能を使ったAnsible実行で注意することは上記【関連3】で説明しているため、そちらを参照してください。
Systems ManagerからのAnsible実行手順
実際にSystems ManagerからPlaybookを実行するには以下のような手順で進めていきます。
流れとしては「Amazon S3からのスクリプトの実行をやってみた。」と同様のRunCommand機能を使用して実行しているため、ほぼ同等の流れとなります。
- SSM Agentインストール
- S3バケットへのPlaybook格納
- S3&Systems Managerアクセス用ロールの作成
- 対象のEC2インスタンスにS3&Systems Managerアクセス用ロールをアタッチ
- Amazon S3からのスクリプトの実行
以下以前の記事と被る部分は省略しつつ説明していきます。
SSM Agentインストール
「Amazon S3からのスクリプトの実行をやってみた。」と同等の手順となるため、割愛。
S3バケットへのPlaybook格納
今回はベストプラクティス構成のPlaybook実行を試してみようと思うので、以下のようなファイル・ディレクトリ構成のPlaybookをS3に格納していきたいと思います。
ansible_playbook
├── group_vars
│ └── all.yml
├── roles
│ ├── packages
│ │ └── tasks
│ │ └── main.yml
│ └── users
│ └── tasks
│ └── main.yml
├── site.yml
└── test_server.yml
# パッケージインストール
yum_install:
- { name: "gcc" }
# test-groupグループ作成
add_group:
- { name: "test-group", gid: "1100" }
# test-userユーザ作成
add_user:
- { name: "test-user", group: "test-group", uid: "1100" }
---
# tasks file for packages
- name: Package Install
ansible.builtin.yum:
name: "{{ item.name }}"
state: present
with_items: "{{ yum_install }}"
---
# tasks file for users
- name: add group
ansible.builtin.group:
name: "{{ item.name }}"
state: present
gid: "{{ item.gid }}"
with_items: "{{ add_group }}"
- name: add user
ansible.builtin.user:
name: "{{ item.name }}"
group: "{{ item.group }}"
uid: "{{ item.uid }}"
state: present
with_items: "{{ add_user }}"
---
- import_playbook: test_server.yml
- name: test_server playbook
hosts: all
become: yes
roles:
- { role: packages }
- { role: users }
尚、S3への格納方法は無圧縮とZip形式に対応しているため、無圧縮でベストプラクティス構成のPlaybookをS3に格納してもよいですが、今回はZip形式に圧縮してからS3に格納しようと思います。
以下MacでZipファイルを作成した場合の例。
zip -r ansible_playbook.zip ansible_playbook
圧縮したソースを適当なバケット直下に格納しておきます。
S3&Systems Managerアクセス用ロールの作成
「Amazon S3からのスクリプトの実行をやってみた。」と同等の手順となるため、割愛。
対象のEC2インスタンスにS3&Systems Managerアクセス用ロールをアタッチ
同上
Amazon S3からのスクリプトの実行
いきなり最終構成には持っていけないため、今回は以下のようなSystems ManagerのRunCommandでAnsibleを単体で実行してみるところまで実施してみます。
コマンドドキュメント
Systems ManagerのRunCommandからAnsibleを実行する方法として以下2つの方法がありますが、AWS-RunAnsiblePlaybookは廃止とのことで互換性のため残されているだけのようです。
そのため、新たに使う場合はAWS-ApplyAnsiblePlaybooksを選択すれば問題ありません。
また、AWS-ApplyAnsiblePlaybooksは、コマンド実行時、デフォルトでAnsibleの実行に必要となるパッケージやモジュールは自動でインストールするようできているため、RunCommand実行のために事前に対象ノードにAnsibleやAnsibleインストールに伴う依存パッケージのインストールを行うようなことはしなくて済むようにできています。
| コマンドドキュメント名 | 説明 |
|---|---|
| AWS-ApplyAnsiblePlaybooks | 複雑なPlaybook実行サポート |
| AWS-RunAnsiblePlaybook | 廃止 |
Run Commandの実行
実際にマネジメントコンソールよりRunCommandでAnsibleを実行していきます。
「Systems Manager」→「ノード管理」→「Run Command」から「Run command」を選択します。
「コマンドドキュメント」は前述の通りAWS-ApplyAnsiblePlaybooksを選択。
同画面下の「コマンドのパラメータ」は以下のように設定していきます。
基本的にはソース設定とCheck設定(いわゆるDryRunで動作させるかの設定)以外はデフォルトのままで設定。
| パラメータ名 | パラメータ | 説明 |
|---|---|---|
| Source Type | S3 | ソースファイル格納先 |
| Source Info | {"path":"https://[バケット名].s3.[リージョン名].amazonaws.com"} | ソースダウンロード先S3のURL |
| Install Dependencies | True | 依存パッケージ自動インストール有無 |
| Playbook File | ansible_playbook/site.yml | Zip解凍時にディレクトリ作成されるため左記パスで指定 |
| Extra Variables | SSM=True | デフォルト設定 |
| Check | False | AnsibleをCheck Modeで動作させるかの設定 今回は反映で設定 |
| Verbose | -v | ログ詳細表示設定 |
| Timeout Seconds | 3600 | 実行タイムアウト設定 |
Source InfoはJSON形式で設定する必要があるので表のように指定します。
Playbook Fileの設定はソースファイルをS3へ無圧縮でアップロードした場合でも、ディレクトリ構成は判断してくれるため、アップロード先のパスに合わせてsite.ymlを指定するだけで問題ありません。
ターゲット
「インスタンスを手動で選択する」を選択し、テスト用に作成したEC2インスタンスをチェックします。
その他の設定
上記設定以外に以下のようなパラメータ設定項目がありますが、今回はAnsibleの動作を確認したいだけなので、通知や出力は行わずに実行を行います。
| 項目名 | 設定内容 |
|---|---|
| その他のパラメータ | デフォルトのまま |
| レート制御 | デフォルトのまま |
| 出力オプション | S3バケットに書き込まないように設定 |
| SNS通知 | 通知しない |
実行結果の確認
実行後、問題なければ以下のように成功します。
また、インスタンスIDを選択すると以下のようにPlaybook実行結果やエラー内容を確認することが可能です。
もし失敗していた場合は、対象ノードに割り当てたIAMロールの権限やPlaybookのパス、エラーログ等を確認しましょう。
おわりに
今回はCI/CD構成を構築する前段階としてSystems ManagerのRunCommand機能を使ってAnsible Playbookを実行してみました。
今回は圧縮したソースファイルを直接S3にアップロードしましたが、最終的にはCodeCommitへのコミットを契機として実行するように構築するため、次回はCodeCommitの環境の準備を行っていきます。




