EC2からもDCからもS3にアクセスする方法を備忘として記録しておきます。
プライベートからS3にアクセスする方法
プライベートサブネットにEC2を設置し、S3を作成します。次にEC2を設置しているVPC内にゲートウェイ型のエンドポイントを作成します。
[VPC]-[エンドポイント]-[サービス]
エンドポイントの検索欄に「s3」と入力します。画面右にスライドさせると「タイプ」の一覧に「Gatteway」が表示されている「com.amazonaws.ap-northeast-1.s3」を選択します。
エンドポイントを作成するVPCを選択しどのルートテーブルを使用してS3にアクセスさせるかを選択します。
ルートテーブルにエンドポイントが追加されているか確認します。
これでプライベートにあるEC2がゲートウェイ型エンドポイントを通ってS3にアクセスできるようになりました。
専用のIAMのユーザーを作成したり、バケットポリシーでアクセスを制限します。
こちらに関しては後日、書きたいと思います。(方法は参照記事にて)
期限を指定してオブジェクトを取得する方法
一時的にアクセスを許可して、指定した人にアクセスをさせる場合は署名付きURLを使用します。
一時的にアクセスを許可して、指定した人にオブジェクトを取得させる場合は署名付きURLを使用します。
[Amazon S3]-[バケット]-[任意のバケット-チェックを入れる]-[アクション]-[署名付きURLで共有]
そうすると時間を指定することができます。
日数で指定することはできないのか・・
日数単位で指定したい場合はAWSCLIを使用します。
-AWS CLI コマンド リファレンス S3 署名する より抜粋-
aws s3 presign s3://DOC-EXAMPLE-BUCKET/test2.txt \
-- 有効期限 604800
有効期限 604800!?
なんのことかと思いましたがこれ秒数だったんですね、、
・7日間の場合
60秒×60分=3600秒
3600秒×24時間=86,400秒
86,400秒×7日=604,800秒
いやいや秒数でやると計算も面倒だし、日にちを指定できないかと調べてみるとありました。
-Amazon S3 署名済み URLAWS SDK for PHPバージョン 3から抜粋-
//Creating a presigned URL
$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => 'my-bucket',
'Key' => 'testKey'
]);
$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
// Get the actual presigned-url
$presignedUrl = (string)$request->getUri();
サポートに問い合わせてみると
($cmd, '+20 minutes')の「minutes」を「day」もしくは「days」にすることで日数で指定できると回答が返ってきました。
1日なら1day、2日なら2days
他にもこんな記事書いています!
参照記事
【AWS】S3 バケットへのインターネット経由でのセキュアなリモートアクセス設定【バケットポリシー】
https://go-journey.club/archives/13053#インターネット経由でアクセスしてくる場合のセキュアな設定
【ゲートウェイ VPC エンドポイント】EC2からプライベート経路でS3などのAWSサービスへアクセスする
https://blog.serverworks.co.jp/2022/07/08/122037#ゲートウェイ-VPC-エンドポイントの作成今回選んだタイプ
AWS CLI コマンド リファレンス
https://docs.aws.amazon.com/ja_jp/cli/latest/reference/s3/presign.html
Amazon S3署名済みURLAWSSDK for PHPバージョン3
https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/s3-presigned-url.html