はじめに
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
転送の仕組み
- base64エンコードされたデータの流れ
[ローカルファイル] →
[base64エンコード] →
[シェル変数($data)] →
[SSMコマンド] →
[EC2インスタンス] →
[base64デコード] →
[復元ファイル]
- 具体的な処理の解説
コマンドを分解すると以下の通りです
echo $data # シェル変数に格納されたbase64エンコード済みデータを出力
| # パイプで出力を次のコマンドに渡す
base64 -d # base64デコードを実行
> # 出力をファイルにリダイレクト
/tmp/test.tar.gz # 出力先のファイル
- なぜこの方法で転送できるのか
- SSM send-commandは本来、EC2インスタンスでコマンドを実行するためのサービスですが、コマンドの引数として文字列データを渡せる特性を利用
- base64エンコードにより、バイナリデータを文字列として扱える
- この性質を組み合わせることで、疑似的なファイル転送を実現
- 技術的なポイント
- 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環境での運用効率を高める実用的なテクニックの一つといえます。
関連情報