awscliv2で”aws s3 cp”を実行すると”SSL validation failed”が頻発するようになった原因と解決策

AWSCLI

不具合の発生

オンプレミスのLinuxからS3互換ストレージへアップロードするときに、時々失敗するようになり、下記のエラーが発生していた。

SSL validation failed for https://s3.ap-northeast-1.wasabisys.com/ EOF occurred in violation of protocol (_ssl.c:2406)

awscliv2は不具合が多い。それなのに情報が殆ど流れていない。ChatGPTの解決策をアテにしてもハマる。
マジメに対応すると骨が折れたのでブログに残す事にした。

まず結論から(解決方法)

・awscli v2で発生する該当エラーには回避策はない(システム依存)
・awcsli v1(pipでインストールできるawscli)を使うと回避できた
・もしくは、互換のawscli相当のツールを使う

暫定対応でawscliv2のまま動く可能性がある方法

awscliv2で正常に動作させるための方法を調査したところ、
"--no-verify-ssl"
というオプションでSSL検証を無効化すると動く(推奨しない)という情報があり、具体的なコマンドだと以下のように s3へのコピーでテストした。

aws s3 cp srcfile s3://dstbucket/srcfile --no-verify-ssl

SSL検証無効化で実行するとwarningが発生するがアップロードが完了するようになった。

これで解決・・とはならず、翌日には"SSL validation failed"が再発することになり次の課題に続く。

翌日に"SSL validation failed"再発

翌日にログを確認すると"--no-verify-ssl"を指定したcronタスクが失敗している事が発覚した。

前日はコピーが完了していたのに、なぜ翌日に失敗したのか。調査しても分からなかったので引き続き対策を検討する。

不具合について調査・対策した内容

  • TLS バージョンの問題
    • サーバークライアントのTLSバージョンが異なる場合に「EOF occurred in violation of protocol」が発生する可能性がある
  • OpenSSL / urllib3 / boto3 の互換性問題
    • TLS ハンドシェイクが失敗することがある
  • ca-certificates の問題
    • 証明書チェーン (ca-certificates) が正しく認識されていないと、TLS 接続の確立に失敗することがある
  • "--endpoint-url" オプションの問題
    • S3互換ストレージと通信する際に互換性の問題が生じる場合がある

全て調査して対策したが、awscliv2では解決せず。

ChatGPTからawscliの代替ツールを聞き出す

代替のCLIツールとしては以下の候補が挙げられた。

s3cmd, s5cmd, mc(MinIO Client), rclone, boto3
ここで気付いたのがawscli v1で動くかどうか確認したところ、問題なく動作した。

結論としてaws s3コマンドでS3へのファイルコピーでSSLエラーが発生した場合はawscli v1を使えば解決する。

pip install awscli

awscli v1の欠点としては「サポート終了」のツールなので、自己責任で使う必要がある点だろう。

S3互換ストレージに対応したCLIツール一覧表

S3互換ストレージに対応した CLI ツールについて、特徴や長所・短所を比較した一覧表を作成した。

ツール名 言語 特徴 長所 短所
awscli v1 Python AWS 公式 CLI の旧バージョン boto3 ベースで安定動作
aws s3 sync が利用可能
✅ S3 互換ストレージとの相性が良かった
❌ 既にサポート終了
❌ TLS 1.2 以上が必須の環境では動作しない可能性あり
awscli v2 Rust/Python AWS 公式 CLI の最新バージョン aws s3 sync を含むフル機能
✅ Rust ベースでパフォーマンス向上
✅ 最新の AWS 認証方式に対応
❌ Wasabi などの S3 互換ストレージで SSL/TLS 関連の不具合が多発
urllib3 との相性問題あり
s3cmd Python 古くからある S3 互換ツール。
AWS, Wasabi 公式サポート
boto3 ベースで Python との相性が良い
syncaws s3 sync とほぼ同等
✅ 設定ファイルを使った認証管理
aws s3 cp より低速
❌ マルチスレッド非対応
❌ GUI なし
s5cmd Go 高速で軽量な S3 CLI。並列処理に対応 aws s3 sync より圧倒的に高速
✅ Go 製で単一バイナリ、依存関係なし
✅ 並列アップロード・ダウンロードが可能
❌ 認証設定がやや手間(環境変数 or 設定ファイル)
boto3 との互換性が低い
mc Go MinIO 公式の S3 互換 CLI。
MinIO, Wasabi, AWS 対応
mc mirroraws s3 sync 相当
✅ シンプルな CLI で使いやすい
mc alias による簡単な認証管理
awscliboto3 との互換性が低い
❌ Go 製のため、Python 連携は考慮されていない
boto3 Python Python で S3 操作を行う公式ライブラリ awscli 相当の機能をスクリプト化できる
✅ 認証情報を AWS プロファイルや環境変数で管理可能
✅ 公式の AWS SDK なので安心
❌ CLI ツールではなく、スクリプトを書く必要がある
❌ コマンド1つで簡単に使えない
rclone Go 多種クラウド対応のファイル同期ツール rclone syncaws s3 sync 相当の操作可能
✅ GUI (rclone browser) あり
✅ S3 以外の Google Drive, Dropbox, OneDrive なども対応
boto3 を使わない
❌ 設定ファイルを事前に用意する必要がある

awscliv2の注意点

  • そもそもawscliv2にはバグが多い
  • バグが多いので頻繁にアップデートされる
  • パッケージマネージャがないのでストレージが大量消費される

awscli2は定期的に最新版を取得しているとストレージ消費がエグイので、
手前みそながら最新版だけを残して古いバージョンを削除して最新版だけを残すbashスクリプトを公開している。

GitHub - kichijoji-cloud/autoremove-oldawscli2
Contribute to kichijoji-cloud/autoremove-oldawscli2 development by creating an account on GitHub.

S3以外の用途では、awscliv2が必須になる用途が多々あるため、
awscliv2の「aws」コマンドを「aws2」等にmvして運用させるのが妥当だと思う。