mito’s blog

IT技術メインの雑記。思い立ったが吉日。

[Ansible][AWS] ParameterStoreモジュールでユーザとパスワードを登録する

はじめに

community.awsにあるssm_parameterモジュールで、ユーザとパスワードを登録します。

community.aws.ssm_parameter module – Manage key-value pairs in AWS Systems Manager Parameter Store — Ansible Documentation


AWS Systems Manager(SSM)パラメータストアは名前にシークレットと付かないし、同系統のサービスでシークレットマネージャーがあるためセキュリティは強くないイメージを持ってしまいますが、そんなことはありません。
オプションには string_type があり、平文のString StringList、暗号化のSecureStringと選択できます。


環境

  • ansible core: 2.13.7
  • community.aws: 5.0.0

5.0.0以降ののモジュール名はcommunity.aws.ssm_parameterで、それより前はcommunity.aws.aws_ssm_parameter_storeです。
使い方は特に変わりありません。


パラメータストアにユーザとパスワードを登録する

パラメータストアは、1組のkey:value(またはlist)が登録できます。
複数のkey:valueが登録できるシークレートマネージャとは異なります。

Playbook

2組のkey:valueを登録するので、それぞれモジュールを実行します。
また、パラメータストアの値はlookupプラグインで取得できます。

---
- hosts: localhost
  gather_facts: no
  
  tasks:
    - name: Create key/value pair in AWS SSM parameter store
      community.aws.ssm_parameter:
        name: "web_user"
        string_type: "String"          # ユーザの種別はStringを指定
        value: "admin"

    - name: Create key/value pair in AWS SSM parameter store
      community.aws.ssm_parameter:
        name: "web_password"
        string_type: "SecureString"    # パスワードの種別はSecureStringを指定
        value: "oioioioi"

    - debug:
        msg: "{{ lookup('amazon.aws.aws_ssm', item) }}"  # lookupプラグインを使って呼び出す
      loop:
        - "web_user"
        - "web_password"


実行ログ

想定通りに登録されました。

$ ansible-playbook add_paramater.yml 
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [localhost] **************************************************************************

TASK [Create key/value pair in AWS SSM parameter store] ***********************************
changed: [localhost]

TASK [Create key/value pair in AWS SSM parameter store] ***********************************
changed: [localhost]

TASK [debug] ******************************************************************************
ok: [localhost] => (item=web_user) => {
    "msg": "admin"
}
ok: [localhost] => (item=web_password) => {
    "msg": "oioioioi"
}

PLAY RECAP ********************************************************************************
localhost : ok=3  changed=2  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0   

$ 





「/」で階層構造を表示する

nameの先頭に「/」を付ける必要があります。
複数のkey:valueをまとめられるシークレットマネージャーと比べると見づらい部分もありますが、
先頭にシステム名を入れスラッシュで区切ると、登録数が増えても幾分か見やすくなります。

Playbook
---
- hosts: localhost
  gather_facts: no
  
  tasks:
    - name: Create key/value pair in AWS SSM parameter store
      community.aws.ssm_parameter:
        name: "/web/user"             # 先頭に必ず「/」を入れる
        string_type: "String"
        value: "admin"

    - name: Create key/value pair in AWS SSM parameter store
      community.aws.ssm_parameter:
        name: "/web/password"         # 先頭に必ず「/」を入れ
        string_type: "SecureString"
        value: "oioioioi"

    - debug:
        msg: "{{ lookup('amazon.aws.aws_ssm', item) }}"
      loop:
        - "/web/user"
        - "/web/password"


実行ログ

無事に取得できました。

$ ansible-playbook add_paramater.yml 
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [localhost] **************************************************************************

TASK [Create key/value pair in AWS SSM parameter store] ***********************************
changed: [localhost]

TASK [Create key/value pair in AWS SSM parameter store] ***********************************
changed: [localhost]

TASK [debug] ******************************************************************************
ok: [localhost] => (item=/web/user) => {
    "msg": "admin"
}
ok: [localhost] => (item=/web/password) => {
    "msg": "oioioioi"
}

PLAY RECAP ********************************************************************************
localhost : ok=3  changed=2  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0

$ 


備考

値を登録するだけであれば、パラメータストアは値の履歴が残り、課金されるまでの上限も余裕があるため、シークレットマネージャーよりも使いやすいかもしれません。
また、CloudFormationではSecureStringは作成できないようです。