63063
AWS EC2 インスタンスに共通のプロビジョニングレシピを作成して実行したいです  
ただ ssh ができるのは踏み台用のごく一部のサーバーで  
その他大多数のサーバーにはセキュリティの都合上 SSH 鍵自体が存在しません

そのため SSH on SSM も利用することができないので  
SSM だけを使ってレシピを実行する方法はないでしょうか  
AWS の操作権限自体はリソース削除系以外作成や変更に関してはある程度何でもできる権限を持ってます

itamae や ansible を試してみたのですがどちらも SSH 前提みたいで

ansible に関しては単独レシピであれば ssm 経由で実行できるみたいなのですが  
OSで分岐するようなコードがかけません（設定ファイルの場所等を吸収できない）

参考：<https://qiita.com/taishin/items/f3b0f3307a4eb2b394cb>

レシピをシェルスクリプト化してS3に置いて実行するというのも可能ですが  
生のシェルスクリプトだと 可読性や運用性において itamae や ansible のようなプロビジョニングツールには劣りますし

参考：<https://dev.classmethod.jp/cloud/aws/manage-instance-by-ec2-run-command-
only/>

itamae や ansible にひたすら aws cli run_command を書くのも可読性が悪くなってしまいます

ansible や itamae に ssh の代わりに ssm 経由でコマンドを投げてくれるモジュールがあればいいのですが…

何かいい方法はないでしょうか
CC BY-SA 4.0
2020-02-14T04:15:48.377
63039
2020-02-17T23:21:05.337
2020-02-17T04:27:08.027
question
aws ansible
AWS環境で複数のEC2にSSHせずに共通のレシピを実行するベストプラクティス
<https://dev.classmethod.jp/server-side/ansible/systems-manager-to-execute-
complex-ansible-playbooks/>

こちらによると、任意に複雑な playbook(ディレクトリ構造)を ssm
で実行できる様子なので、これで分岐処理も吸収できるのではないか、とおもっているのですが、いかがでしょうか？  
(自分は、この機能を使ったことがないので、本当に可能かは把握していません)
CC BY-SA 4.0
2020-02-15T07:09:09.983
63063
2020-02-15T07:09:09.983
754
63039
answer
まだリリースされていませんが、ansible
devel版では[aws_ssmプラグイン](https://docs.ansible.com/ansible/devel/plugins/connection/aws_ssm.html)が用意されています。これを使用することでsshの代わりにssm経由でリモートのEC2を管理できます。

なおsshさせないのであれば、鍵を置かないのではなく、sshdを停止させるべきです。

* * *

[ステップ 7: (オプション) Session Managerを通して SSH
接続を有効にする](https://docs.aws.amazon.com/ja_jp/systems-
manager/latest/userguide/session-manager-getting-started-enable-ssh-
connections.html)で説明されていますが`~/.ssh/config`に

```

    host i-* mi-*
        ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
    
```

等を記述することで実現できます。

この設定を行うとsshは直接EC2へ接続するのではなく、`aws ssm start-session...`を実行します。すると、aws cliはAWS
APIエンドポイントまではHTTPSで接続し、そこからEC2まではSSMで接続を行いトンネルを作成します。sshはそのトンネル内で通信するため、EC2 /
VPCはポートを開ける必要がなくなります。

正確には[ステップ 5: (オプション) PrivateLink を使用して Session Manager の VPC
エンドポイントを設定する](https://docs.aws.amazon.com/ja_jp/systems-
manager/latest/userguide/session-manager-getting-started-
privatelink.html)が必要ですが、既にSSMが使用できているようですのでその辺りは設定済みと思われます。
CC BY-SA 4.0
2020-02-15T09:05:45.513
63066
2020-02-17T23:21:05.337
2020-02-17T23:21:05.337
4236
4236
63039
answer