はじめに
最近勉強がてら「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
の環境の準備を行っていきます。