目次
はじめに
こんにちは、ディーネットの山田です。
プライベートサブネット上に存在するEC2に対して、外部からファイルを持ち込む方法について、検証を行いました。
構成図に表現しておりますが、インターネットには接続できない環境となっております。
そのため、ファイル共有リンクなどは使えず、S3バケットを用いております。
環境構成図
環境の前提
- S3のゲートウェイ型VPCエンドポイントがすでにVPC上に存在していること。
- VPCエンドポイント側のポリシーはデフォルト許可としています。
作業内容
持ち込みたいファイル等を設置するためのS3バケットを作成
S3バケットを作成します。
バケット名は、任意のもので構いません。
S3バケットポリシーを設定
VPCエンドポイントのIDを記載したS3バケットポリシーを記載します。
ここで、記載するS3バケットポリシーには、否定の判定を用いたDenyを使用しないでください。
※Denyを用いると、AWSマネジメントコンソールからも操作できない悲しいS3バケットが誕生します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowReadFromVPCEndpoint",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::xxxxxxxx-upload-demo",
"arn:aws:s3:::xxxxxxxx-upload-demo/*"
],
"Condition": {
"StringEquals": {
"aws:SourceVpce": "{VPCエンドポイントのID}"
}
}
}
]
}
持ち込みたいファイルを該当のS3バケットにアップロード
持ち込みたいファイルをS3バケットにAWSマネジメントコンソールからアップロードしてください。
今回は、AWS CLIのインストーラを持ち込みたかったので、AWS CLIのインストーラをアップロードしています。
アップロードできたら「オブジェクトURL」を控える
アップロードが完了しましたら、オブジェクト単位で発行される「オブジェクトURL」を控えてください。
URLは長いことがあるので、コピペすることを推奨します。
関係のないところからアクセスするとアクセス拒否されます
S3バケットのバケットポリシーに設定した内容は、全開放ではないので、許可されていないところからアクセスしてもエラーになることがわかります。
PowerShellで以下のコマンドを実行し、ダウンロードしてみます
対象のEC2上(S3バケットポリシーで許可したVPCエンドポイントを経由する環境)で、対象のファイルをダウンロードしてみます。
Invoke-WebRequest -Uri https://xxxxxxxx-upload-demo.s3.ap-northeast-1.amazonaws.com/AWSCLIV2.msi -outfile $env:USERPROFILE\Downloads\AWSCLIV2.msi
ダウンロード中は、こんな感じ。
無事に、ダウンロードフォルダ上にAWS CLIのインストーラをダウンロードすることができました。
まとめ
- VPCエンドポイントとS3バケットポリシーを組み合わせることで、IAMロールの割り当てなど難しいことをしなくとも簡単にファイルを持ち込むことができました。
- また、AWS CLIを活用できれば、複数のファイルを一括でダウンロードすることも容易になります。
- 以前のブログで、署名付きURLをご紹介しましたが、署名付きURLは認証の署名がURLに含まれる観点から長いURLとなりますので、頻繁に利用するのであれば、S3バケットポリシーを使った方法も視野にいれてみてはいかがでしょうか。
- Windows Server環境を例にしましたが、Linux環境でも同様に可能です。

プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。