質問: AWS EC2 インスタンスに共通のプロビジョニングレシピを作成して実行したいです ただ ssh ができるのは踏み台用のごく一部のサーバーで その他大多数のサーバーにはセキュリティの都合上 SSH 鍵自体が存在しません そのため SSH on SSM も利用することができないので SSM だけを使ってレシピを実行する方法はないでしょうか AWS の操作権限自体はリソース削除系以外作成や変更に関してはある程度何でもできる権限を持ってます itamae や ansible を試してみたのですがどちらも SSH 前提みたいで ansible に関しては単独レシピであれば ssm 経由で実行できるみたいなのですが OSで分岐するようなコードがかけません(設定ファイルの場所等を吸収できない) 参考: レシピをシェルスクリプト化してS3に置いて実行するというのも可能ですが 生のシェルスクリプトだと 可読性や運用性において itamae や ansible のようなプロビジョニングツールには劣りますし 参考: itamae や ansible にひたすら aws cli run_command を書くのも可読性が悪くなってしまいます ansible や itamae に ssh の代わりに ssm 経由でコマンドを投げてくれるモジュールがあればいいのですが... 何かいい方法はないでしょうか
回答: まだリリースされていませんが、ansible devel版ではaws_ssmプラグインが用意されています。これを使用することでsshの代わりにssm経由でリモートのEC2を管理できます。 なおsshさせないのであれば、鍵を置かないのではなく、sshdを停止させるべきです。 ステップ 7: (オプション) Session Managerを通して SSH 接続を有効にするで説明されていますが`~/.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 エンドポイントを設定するが必要ですが、既にSSMが使用できているようですのでその辺りは設定済みと思われます。