本記事では、AWS CLIを用いてS3ゲートウェイエンドポイント経由でPublicSubnet内のEC2インスタンスからPrivateSubnet内のEC2にファイルを転送する手法を紹介します。
概要
背景として、当初PublicSubnetに構築したEC2をPrivateSubnetに移行するタスクがあり、
セキュリティ面を考慮の上、インターネットを経由せずにデータを移行する必要がございました。
追加コストを発生させないこと、実施が容易で運用負担が低いこと、加えて汎用的な手法で実施したいと考え、
AWS閉域網内で通信可能なS3ゲートウェイエンドポイントを経由し、ファイルを転送する手法を実施しました。
他のファイル転送手法として、SSH経由で直接EC2同士でSCP転送する手法や、マウント済みEFSによりディレクトリ内のファイル共有など手法は幾つか考えられますが、
前述した理由に加え、移行元/先のEC2が同一VPC内に存在する必要がない点、将来的に作成予定のS3バケットの再利用を想定し、S3ゲートウェイエンドポイント経由での手法を選択しました。
S3ゲートウェイエンドポイントについて
ここでS3ゲートウェイエンドポイントについて、簡単におさらいします。
VPCのEndpointとして、下記2種類のタイプがございます。
これらゲートウェイエンドポイントを経由することで、Internet GatewayやNAT Gatewayを経由することなく、AWS閉域網内で通信することができます。
S3をファイル格納先として使用する際に、追加コストなしでPrivateSubnetからセキュアにデータアクセスできるため、標準的に使用する機能ではないでしょうか。
項目 | S3ゲートウェイエンドポイント | インタフェースエンドポイント (PrivateLink) |
---|---|---|
対象 | S3、DynamoDB | AWSサービスやAWS上のサードパーティのサービス向け通信 |
通信 | ・同一VPC内からインターネットを経由せずにアクセス可能。 ・S3ゲートウェイエンドポイント向けルートがルートテーブルに追加される。 ・ルートテーブルを元に宛先に到達し、ENIは作成されない。 | ・他VPC/他アカウント間でインターネットを経由せずにアクセス可能。 ・ENI経由(自動作成される)でプライベートIPで通信可能。 ・ルートテーブルへのルート追加は不要。 |
費用 | 無料 | 時間と通信料で課金 |
注意点として、S3ゲートウェイエンドポイントのエンドポイントのIPはGlobal IPアドレスのため、もしNACLの通信許可をプライベートIPのみ許可している場合はS3への通信が制限されます。
一方で、インタフェースエンドポイントはENIを作成するため、セキュリティグループのルールによって制限されます。
実施手順の説明
概要手順
それでは、今回実施する概要手順を示します。
- 移行用S3バケット作成
- S3ゲートウェイエンドポイント作成
- IAMポリシー/ロール作成と付与
- 移行先EC2のセキュリティグループ更新
- 移行元(パブリックEC2)からS3へファイルアップロード
- 移行先(プライベートEC2)からS3経由でファイルダウンロード
ファイル転送に伴い新規に作成するリソースとしては、下記3つとなります。
- S3バケット
- S3ゲートウェイエンドポイント
- IAMロール/IAMポリシー
手順実施の前提として下記を想定しています。
- SSH接続やセッションマネージャ経由にてEC2上でコマンドが実行できる環境であること
- ローカル環境のターミナルからSSH接続する場合は、EC2のキーペア準備、SSHポートへのアクセス許可をセキュリティグループに設定
- セッションマネージャ経由であれば、EC2にSSM Agentをインストール
- ローカル環境のターミナル、及び移行元/移行先のEC2にAWS CLIがインストールされていること
- EC2においては、Amazon LinuxのOSを選択すればAWS CLIがプリインストール済み
~/.aws/credentials
、~/.aws/config
に認証情報(アクセスキー/シークレットアクセスキー)や設定情報(リージョン等)を設定- S3バケット作成時にローカル環境のターミナルからAWS CLIのコマンドを実行し、
S3へファイルアップロード/ダウンロード時にEC2からAWS CLIのコマンドを実行します。
- S3バケット作成時にローカル環境のターミナルからAWS CLIのコマンドを実行し、
詳細手順
これより実施コマンドを含めた詳細手順を紹介します。
S3バケット(S3ゲートウェイエンドポイント経由でアクセスするファイル格納先)作成
- AWS CLIが実施できるターミナルから下記コマンドを実行します。
aws s3 mb s3://{バケット名} --region ap-northeast-1 --profile {プロファイル名}
- 作成するS3バケットは一意な名称を付けてください。
- 以降の説明では
test-bucket
という名前を使用します。
- 以降の説明では
- リージョンは東京リージョンに統一していますが、お好きなリージョンで構いません。
- AWS CLIが実施できるターミナルから下記コマンドを実行します。
S3ゲートウェイエンドポイント作成
- マネジメントコンソールから作成する手順を示します。
- VPCダッシュボード > 左ペイン内PrivateLinkとLattice内のエンドポイント > エンドポイントを作成、を選択
※ 左ペインからエンドポイントサービス
ではなく、エンドポイント
を選択ください。
エンドポイントサービスは、S3アクセス向けではなく、他VPC/アカウント向けにサービスを提供する際に作成するエンドポイントとなります。- 名前タグ:{お好きな名前}
- タイプ:AWSのサービス
- サービス:com.amazonaws.ap-northeast-1.s3(タイプ:Gatewayを選択すること。)
- ネットワーク:EC2が含まれるVPC名を選択
- ルートテーブル:PrivateSubnet内のEC2を選択
- 上記を指定し、エンドポイントを作成、を選択
- 作成後、エンドポイントタイプ
Gateway
、サービス名com.amazonaws.ap-northeast-1.s3
、のエンドポイントが作成されていることが確認できます。
- VPCダッシュボード > 左ペイン内PrivateLinkとLattice内のエンドポイント > エンドポイントを作成、を選択
- マネジメントコンソールから作成する手順を示します。




EC2に付与するIAMポリシー作成
IAM > 左ペイン内ポリシー > ポリシーの作成、を選択
- ポリシーの作成エディタでJSONを選択し、下記のポリシーを入力、次画面でお好きなポリシー名を設定しポリシーの作成、を選択
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::{test-bucket}" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::{test-bucket}/*" }, { "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:ListAllMyBuckets" ], "Resource": "*" } ] }
- EC2に付与するIAMロール作成
- IAM > 左ペイン内ロール > ロールを作成、を選択
- 信頼されたエンティティタイプ:AWSのサービス
- ユースケース:EC2
- 許可ポリシー:先ほど作成したカスタマー管理タイプのポリシーを選択し次へ、次画面でお好きなロール名を設定しロールを作成、を選択
- IAMロールをPublicSubnet内のデータ移行元EC2にアタッチします。
- EC2 > 左ペイン内インスタンス > PublicSubnet内の対象EC2を選択
- 右上アクション > セキュリティ > IAMロールを変更、より先ほど作成したいIAMロールを選択し、IAMロールの更新、を選択

- IAMロールをPrivateSubnet内のデータ移行先EC2に付与します。
- 上記手順と同様に、PrivateSubnet内のデータ移行先EC2に作成済みIAMロールを付与します。
PrivateSubnet内EC2のセキュリティグループ更新
- PrivateSubnet内のEC2のセキュリティグループに、S3ゲートウェイエンドポイント向けのアウトバウンドルールを作成し、付与する。
- 送信先であるS3のプレフィックスリストIDは、VPC > マネージドプレフィックスリスト、から確認する。
- セキュリティグループ > 対象EC2に付与しているセキュリティグループを選択(EC2作成時に既に何らかのセキュリティグループを割り当てている前提です。) > アウトバウンドルールタブよりアウトバウンドのルールを編集を選択
- ルールを追加、より
- タイプ:HTTPS
- ポート範囲:443
- 送信先:上記より確認したS3ゲートウェイエンドポイントのプレフィックスリストIDを入力し、ルールを保存を選択
- PrivateSubnet内のEC2のセキュリティグループに、S3ゲートウェイエンドポイント向けのアウトバウンドルールを作成し、付与する。


- こちらで設定自体は完了となります。
- 下記コマンドより、作成済みS3バケットをリスト表示できることを確認します。
aws s3 ls s3://{test-bucket}/ --region ap-northeast-1 --profile {プロファイル名}
- 移行元EC2からS3にファイルアップロード
- 移行元EC2にログイン > ターミナルから下記コマンドを実行し、ファイルをアップロードします。
aws s3 cp {移行対象ファイルパス/ファイル名} s3://{test-bucket}/
- 実施後、該当S3バケット内にファイルがアップロードされていることを確認ください。
- S3から移行先EC2にファイルダウンロード
- 移行先EC2にログイン > ターミナルから下記コマンドを実行し、ファイルをダウンロードします。
aws s3 cp s3://{test-bucket}/{ファイル名} /{ダウンロード先のファイルパス}/
- 実施後、移行先EC2に該当ファイルが格納されていることを確認ください。
こちらでファイル転送の手順完了となります。
終わりに
以上、AWS CLIを用いて、S3ゲートウェイエンドポイント経由でPublicSubnet内のEC2からPrivateSubnet内のEC2にファイルを転送する手法の紹介でした。
セキュアなファイル転送を手軽に実装できることを感じていただけたのではないでしょうか。
ご一度いただきありがとうございました。 本記事が皆さまのAWS活用の一助となれば幸いです。