Amazon S3はAWSにおけるオンラインのストレージサービスです。
Google DriveやDropboxのようなツールをイメージすると分かりやすいでしょう。
今回はS3のバケットの作成とAWS CLIを使ってファイルのアップロードを試してみましょう。
2018年3月現在、S3は無料枠が5GBに制限されており、他のストレージサービスと比較すると少し割高に感じられます。
しかしAWSサービスとの連携が容易で、AWS CLIを組み合わせて自動化すればスマートな管理ができます。
加えて 99.999999999% という高い耐久性を維持しており、どこからでも安全にデータを保管できる強力なストレージです。
主な使い方としては次ケースが挙げられます。
メディアファイルはサイズが大きいため、メインのサーバーと分けることでサーバーの容量不足対策となります。また、 回線が高速なのでコンテンツの配信に向いています。 WordPressで公開する記事内の画像ファイルなどをS3に保管することで、メインサーバーの負荷を減らしつつ高速にコンテンツを提供できます。
ログは長期間記録すると無視できない大きさになることが稀にありますし、サーバーへ入らずにS3からログをダウンロードできれば、 誤ったコマンド操作で貴重なファイルを削除するリスクも無くせます。
Google Driveと同様に、 ファイルのバックアップや共有 目的に利用できます。
GitHub pages や GitLab pages のように、 静的なWebサービスの公開に利用できます。
HTML/CSS, JavaScriptなどの静的なプログラミング言語のみで作成されたWebページであれば、EC2よりも低コストで運営が可能です。
さらに独自ドメインやSSL証明書の割り当てができ、S3だけで静的なWebサイトの全てをこなすことができます。
それではさっそくS3を利用しましょう。
S3ではバケットと呼ばれるオブジェクト(ディレクトリのようなもの)を作成し、その中にファイルを保管します。
1.S3のダッシュボードを開き、バケットの作成をクリックします。
2.バケットの名前とリージョンを設定します。EC2とS3を連携させたいため、EC2インスタンスが置かれているリージョンを選んでください。既存のバケットがあればその設定を引き継ぐことができますが、今回は初めてなので空欄のまま次へ進みます。
3.バケットのプロパティを設定します。通信の暗号化やバージョン管理を有効にするなど、便利なプロパティがあるので必要に応じて適用します。この設定は後から追加することができるため、何もせずに次へ進んでも大丈夫です。
4.パーミッションの設定をします。読み込みと書き込みの許可をアカウントごとに設定することができます。また、今回はバックアップ目的での利用のため、 バケットの公開をしないよう設定してください。
5.設定内容を確認して作成ボタンをクリックします。
作成されたバケットはダッシュボードに表示されます。
今回はEC2とS3の間でファイルの転送を行いたいのですが、S3はEC2が設置されているネットワーク(VPC)の外側にあるサービスです。
そこで、エンドポイントと呼ばれるコンポーネントをVPCにアタッチして、S3との通信ができるように設定する必要があります。
これまでの記事で構築したインフラにエンドポイントをアタッチすると、次のようなイメージになります。
S3との通信はインターネットゲートウェイ経由でも可能ですが、その場合はトラフィックが一度インターネットへ出てしまいます。VPCエンドポイントを使えば、AWSのサービス内でセキュアにトラフィックを流すことができ、通信料金もかからないので経済的です。
1.VPCのダッシュボードを開き、 エンドポイント の作成ボタンをクリックします。
2.宛先の選択をします。 AWS services と com.amazonaws.ap-northeast-1.s3 にチェックを入れます。
3.通信したいEC2インスタンスが置かれているVPC と そのサブネットに当てられているルートテーブル を選択します。エンドポイント作成時に一度通信が遮断されるので、インスタンスで何か通信を行なっている場合は、それが終わってから作成すると良いでしょう。
4.ポリシーの設定をします。デフォルトでは全ての操作を許可するポリシーがセットされていますが、このようなポリシーはセキュリティホールの原因となるので、必要最小限のポリシーに絞ります。作成したS3のバケットに対してのみ操作可能なポリシーを作成しましょう。
ポリシーの例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "Version": "2012-10-17", "Id": "Policyxxxxxxxxxxxxx", "Statement": [ { "Sid": "Access-to-S3", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::YOUR-S3-BUCKET-NAME", "arn:aws:s3:::YOUR-S3-BUCKET-NAME/*" ] } ] } |
作成が完了すると、ダッシュボードにエンドポイントが表示されます。
紐付けたサブネットのルートテーブルを確認すると、エンドポイントを介したS3への経路が追加されています。
それではEC2インスタンスからS3のバケットへアクセスできるか見ていきましょう。
インスタンスへsshしてください。
1 |
ssh -i "~/.ssh/HOGEHOGE" -p xxxxx USER@FQDN |
~
試しにゴミファイルを作成し、バケットへ放り込みます。
1 2 3 |
touch gomi aws s3 mv gomi s3://YOUR_S3_BUCKET/gomigomi aws s3 ls s3://YOUR_S3_BUCKET/ |
アップロードできました!やったね!
helpコマンドで aws s3 コマンドを調べてください。どのようなことが出来るでしょうか。気になったコマンドを試してみましょう。
1 |
aws s3 help |
S3のバケット作成、VPCエンドポイントによるEC2-S3間の経路追加、そしてEC2からバケットへファイルのアップロードを行いました。
次回はAWS CLIとシェルスクリプト、そしてCrontab、3つの技術を駆使してコンテナの自動バックアップシステムを作ります。
>>EC2からS3へ自動でぽいぽいアップロードするスクリプトの作成
社員の成長を導きながら、AIやビッグデータなどの最先端技術をプロジェクトに活用していくことが私たちのビジョンです。Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を一緒に達成しませんか?