「EC2上のアプリケーションからS3へファイルをアップロードしたい!」
S3はとても便利なサービスです。
耐久性が高く料金も安いので、
AWSのストレージ系サービスとしては、ぶっちぎりでNo1のサービスといえます。
そんなS3に対して、このようにEC2からファイルを格納する(または取り出す)ケースは非常に多いと思います。
EC2からS3へファイルを格納するにはどうしたらよいのでしょうか?
今回はその方法をご紹介します。
本記事をお読みいただくことで、どのようにすればEC2からS3に対してファイルを格納する(または取り出す)ことができるのかがわかります。
EC2からS3へファイルを送受信する方法
S3はネットワークストレージです。
EBSのように直接EC2にマウントすることはできません。
※Storage GatewayというAWSサービスを利用すれば、S3をEC2やPC端末に擬似的にマウントすることが可能です。
ご興味がありましたら、次の記事をお読みください。
容量無制限のNASを手に入れる!MacでS3に直接接続する方法
そのため、EC2からS3へファイルを格納(または取出)するには、ネットワーク経由でファイルを送受信する必要があります。
ネットワーク経由でファイルを送受信する具体的な方法は以下の2つです。
- AWS SDKを使う
- AWS CLI(Command Line Interface)を使う
AWS SDKとは、AWSが提供するアプリケーション開発キットです。
各種言語ごとに用意されており、AWSサービスのAPIを容易に使用することが可能となります。
そしてAWS CLIとは、コマンドラインやシェルなどのスクリプト上でAWSサービスを操作することができるツールです。
その他、サードパーティ製のツール等もありますが、
EC2からS3に対してファイルを送受信する方法としては、上記の2つが一般的と言えます。
外部アクセスが許可されていないEC2からアクセスするには
S3はVPC外のリージョンサービスです。
VPC内にあるAWSサービスからアクセスするには、一度VPC外に出る、つまりインターネット(外部)を経由してS3へ到達するのが基本です。
ですが中には外部接続を許可していないEC2からS3へアクセスしなくてはならない、といったケースも考えられます。
そんな時に役立つのが、VPCエンドポイントの利用です。
VPCエンドポイントとは、VPC内のサービスから外部を経由することなく、VPC外サービスにアクセスできるAWSサービスです。
VPCエンドポイントを使うことで、外部へのアクセスが許可されていないEC2からでもS3へ接続することが可能となります。
ただし注意点が1つあります。
VPCエンドポイント経由でS3へ接続する場合、接続元のEC2とVPCエンドポイント、そしてS3バケットは同リージョンであることが必須条件となります。
どれか1つでも異なるリージョンとなると、うまくアセクスできませんのでご注意を!
S3へアクセスするための権限設定
EC2からS3へアクセスする経路があるかといって、
それだけではS3へはアクセスできません。
S3へアクセスするためにはアクセス権限が必要となります。
EC2からS3へのアクセスするための権限を設定するには、以下の4つの方法があります。
- S3へアクセスできるIAMユーザーのアクセスキーとシークレットキーをEC2に割り当てる
- S3へアクセスできるIAMロールをEC2に割り当てる
- S3のACLを設定する
- S3のバケットポリシーを設定する
1,2はEC2に対して権限を設定する方法であり、
3,4はS3に対して権限を設定する方法となります。
以下より各方法についてご説明します。
S3へアクセスできるIAMユーザーのアクセスキーとシークレットキーをEC2に割り当てる
対象のS3バケットに対して権限をもったIAMユーザーを作成し、アクセスキーとシークレットキーを発行します。
発行したアクセスキーとシークレットキーを以下のaws configure コマンドを使ってEC2に設定します。
1 2 3 4 5 |
aws configure AWS Access Key ID [None]: [アクセスキー] AWS Secret Access Key [None]: [シークレットキー] Default region name [None]: [リージョン] Default output format [None]: json |
で、ここまでお話してなんなんですが・・・
この方法は極力使わないようにしましょう!
(じゃ、書くなよって話なんですが・・・苦笑)
というのも、アクセスキーとシークレットキーを利用するのはセキュリティ的にリスクが高いのです。
万が一アクセスキーとシークレットキーが他の悪意のある人の手に渡ってしまったら、
簡単に悪用されてしまいます。
EC2へ権限を割り当てる場合は、次のIAMロールを利用するのが推奨されております。
Amazon EC2 インスタンスで動作するアプリケーションは、AWS の他のサービスにアクセスするために認証情報が必要です。アプリケーションに認証情報を提供する安全な方法は、IAM ロールを使用することです。
※AWS Document(IAM のベストプラクティス)より引用
S3へアクセスできるIAMロールをEC2に割り当てる
S3にアクセスできるIAMポリシーを割り当てたIAMロールを作成し、
そのIAMロールを対象のEC2に割り当てます。
S3にアクセスできるIAMポリシーは、
デフォルトでは”AmazonS3FullAccess”や”AmazonS3ReadOnlyAccess”があります。
しかし、これらはすべてのバケットに対するアクセス権限を付与しておりますので、
より強固なセキュリティ設定を行う場合は、対象のバケットを指定するとか、対象の操作だけを行えるようにするといったカスタマイズが必要です。
ご利用する場合は、その辺りを考慮するのがよろしいかと思います。
上記でも描きましたが、この方法は、EC2に対する権限設定の推奨方法となります。
S3のACLを設定する
ACLとは、Access Control Listの略です。
S3のバケット、またはオブジェクトの単位で権限設定ができます。
そしてこの方法は、“AWSアカウント”に限定したアクセス制御になります。
そのため以下のようなアクセス制御となります。
- どのAWSアカウントにアクセス権を与えるか
- パブリックアクセス(AWSアカウント関係なく誰でもアクセスができること)とするか
S3のバケットポリシーを設定する
JSONで記述されたポリシーを、S3バケット(またはオブジェクト)に割り当てる方法です。
この方法は、非常に柔軟な権限設定が行えます。
上記のACL設定とは異なり、AWSアカウントはもちろん、
特定のIAMユーザやAWSサービスに対してアクセス制御をすることが可能です。
<バケットポリシー例>
特定のIPアドレスに対するアクセス制御
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "IPAllow", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "IpAddress": {"aws:SourceIp": "54.240.143.0/24"}, "NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"} } } ] } |
※AWS Document(バケットポリシーの例)より引用
EC2からAWS CLIを使ってS3にアクセスしてみる
それでは最後にEC2からS3へAWS CLIを使って簡単な接続テストをしてみましょう。
今回は以下のようなシステム構成にてテストを行います。
- 外部接続ができるEC2
- AmazonS3FullAccessというポリシーを設定したIAMロールをEC2に割り当てる
- アクセス先のバケット名は”hidesan-test-001″
<テスト>
EC2ログインし、次のAWS CLIコマンドを使ってテストファイルをS3バケットに格納します。
EC2のカレントディレクトリにある”test.txt”を”hidesan-test-001″配下に移動するという内容のコマンドになります。
1 |
aws s3 mv ./test.txt s3://hidesan-test-001/ |
※AWS CLIを使ったS3操作に関する詳細はこちらのAWS Documentをご参照ください。
<結果確認>
AWSコンソール画面から、”hidesan-test-001″バケットの配下を見てみると、
以下のように無事格納されておりました。
いかがでしたでしょうか?
EC2からS3へファイルを送受信する場合、
ポイントとなるのは、EC2からS3へのアクセス経路とアクセス権限の付与です。
アクセス権限の付与方法については、
EC2に対してアクセス制御設定を行うならIAMロールを利用する方法、
S3に対してアクセス制御設定を行うならバケットポリシーを利用する方法が良いかと思います。
本記事を参考に色々と試してみてくださいね。
以上、hidesanでした!