AWS Systems Manager (SSM)を使った簡単ファイルを転送する – base64エンコーディング活用

A bunch of ribbons that are flying in the air

はじめに

AWS Systems Manager (SSM)には直接的なファイル転送機能がありませんが、base64エンコーディングを活用することで、シンプルかつ効果的なファイル転送が実現できます。この記事では、実践的な手順とともに、その方法を詳しく解説します。

前提条件

  • AWSアカウントとIAM権限の設定
  • AWS CLIのインストールと設定
  • 転送先のEC2インスタンスにSSMエージェントがインストール済み

実装手順

1. ローカルファイルのbase64エンコード

最初に、転送したいファイルをbase64形式でエンコードします。

base64 -i /tmp/20250127/test.tar.gz -o /tmp/20250127/test.tar.gz.b64
data=$(cat /tmp/20250127/test.tar.gz.b64)
aws ssm send-command \
    --document-name "AWS-RunShellScript" \
    --targets "Key=instanceIds,Values=i-XXXXXXXXXXXXXXXXX" \
    --parameters "commands=[\"echo $data | base64 -d > /tmp/test.tar.gz\"]" \
    --region ap-northeast-1

転送の仕組み

  1. base64エンコードされたデータの流れ
    [ローカルファイル] →
    [base64エンコード] →
    [シェル変数($data)] →
    [SSMコマンド] →
    [EC2インスタンス] →
    [base64デコード] →
    [復元ファイル]
  2. 具体的な処理の解説

コマンドを分解すると以下の通りです

echo $data           # シェル変数に格納されたbase64エンコード済みデータを出力
  |                  # パイプで出力を次のコマンドに渡す
base64 -d           # base64デコードを実行
  >                 # 出力をファイルにリダイレクト
/tmp/test.tar.gz    # 出力先のファイル
  1. なぜこの方法で転送できるのか
  • SSM send-commandは本来、EC2インスタンスでコマンドを実行するためのサービスですが、コマンドの引数として文字列データを渡せる特性を利用
  • base64エンコードにより、バイナリデータを文字列として扱える
  • この性質を組み合わせることで、疑似的なファイル転送を実現
  1. 技術的なポイント
  • base64エンコードにより、バイナリファイルも安全に文字列として送信可能
  • AWS Systems Managerのセキュアな通信経路を利用
  • 追加のポート開放やツールが不要
  • コマンド実行時の文字列制限があるため、大きなファイルには不向き

制限事項

  • SSM send-commandの文字列長制限(約48KB)
  • 実行時間の制限(デフォルトで30分)
  • base64エンコードによるオーバーヘッド(サイズが約1.33倍に増加)

セキュリティ面での利点

  • AWS IAMによるアクセス制御
  • 通信経路の暗号化
  • EC2インスタンスへの直接アクセス不要
  • 操作ログがCloudTrailに記録される

このように、SSMのコマンド実行機能を巧みに利用することで、シンプルながら効果的なファイル転送を実現しています。

転送確認

# セッション開始
aws ssm start-session --target i-XXXXXXXXXXXXXXXXX --region ap-northeast-1

# 転送確認
sh-4.2$ ls -l /tmp/test.tar.gz
-rw-r--r-- 1 root root 332  1月 27 09:54 /tmp/test.tar.gz

セキュリティに関する注意

このガイドでは、インスタンスIDを i-XXXXXXXXXXXXXXXXX と表記しています。実際の使用時は、ご自身の環境の正しいインスタンスIDに置き換えてください。セキュリティ上の理由から、本番環境のインスタンスIDは公開しないようご注意ください。

注意点としては前述した通り、大容量ファイルの転送には適していません。
また、base64エンコードによるオーバーヘッドであったり、コマンド実行の制限時間がある

まとめ
AWS SSMとbase64エンコーディングを組み合わせることで、シンプルながら効果的なファイル転送が実現できます。小規模なファイルやスクリプトの転送に特に有効なこの方法は、AWS環境での運用効率を高める実用的なテクニックの一つといえます。
関連情報

AWS Systems Manager公式ドキュメント
AWS CLIのインストールガイド