[AWS] S3作成とIAMロールでEC2からS3にアクセスする
EC2 上にあるサイトから S3 にアクセスしてファイル操作をするための最初のステップ。
AWS S3 と IAM ロールを作成し、 EC2 インスタンスに IAM ロール を割り当てることで S3 へアクセスする方法。 IAM ユーザーを作って S3 へアクセスする方法が多く紹介されているが、 AWS 的には IAM ロールの使用を推奨しているよう。
S3 について
S3 とは
まず、S3 とは Simple Storage Service の略で、 AWS のストレージサービス。つまりファイルを保存しておく場所を貸してくれるサービス。
AWS 曰く、ナインイレブン 99.999999999% の耐久性がある。そして、 EC2 内のローカルストレージとして使われている(はず) EBS ( Elastic Block Store )より費用が安く済む。また、最初から容量を決めておく必要がなく、使った分だけ課金されていく。(実際は、使った容量の費用 + データ転送やリクエストごとに別途費用がかかる。 Amazon S3 の料金 )
用語
S3 で使われる言葉の説明
用語 | 説明 |
---|---|
オブジェクト | ファイル(データ)のこと。 |
バケット | オブジェクトの保存場所。ルートフォルダ的なもの。 S3 の中にバケットを作り、バケットごとにアクセス制御が可能。 AWS 1 アカウントにつき 100 個まで作成できる。 |
キー | オブジェクトの固有の識別子(オブジェクト名のこと)。オブジェクトはバケット・キー・オブジェクトで一意となる。 |
アクセス制御
S3 のアクセス制御の方法は、「バケットポリシー」「 IAM ポリシー」「 ACL 」などいろいろあって複雑。
まず、バケット作成時にパブリックアクセス設定を行うのだが、これは対象バケットを一般公開にするかしないかの設定。
S3 では、静的ウェブサイトをホスティングできるので、このような場合は公開設定にするけど、基本的には、プライベート設定(非公開)が推奨されていて、デフォルトでもそのようになっている。
プライベート設定の場合、認証情報(アクセス許可)がないとアクセスできない。
S3 へのアクセス制御は IAM ロールを使う
S3 は基本的に認証情報がないとアクセス不可なため、 IAM ( AWS Identity and Access Management ) ユーザーやロールというのを作成し、これらの認証情報を使ってアクセスすることとなる。
ググると、 IAM ユーザーを使った方法が多かったが、ユーザーを使う場合、ユーザー作成時に credentials (アクセスキーとシークレットアクセスキー)が作られ、これをサーバー上(またはプログラム上)で取り扱うことになる。
一方、 IAM ロールを EC2 に割り当てる場合、(何かしらによって)自動で一時的な認証情報(アクセスキーとシークレットアクセスキーとトークン)が作られ、 EC2 – S3 アクセス時に一時的な認証情報を使って、勝手にやりとりしてくれる。
つまり、自分で認証情報を管理したり、どっかに書いたり置いておく必要がなく楽だし、セキュアそうなので IAM ロールを使うことにした。
IAM ロールの仕組みとか詳しくは、 Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する を参照してほしい。
手順
これから以下のことをおこなっていく。
- S3 バケットの作成
- IAM Role を作成し EC2 に割り当てる
S3 バケットの作成
AWS マネジメントコンソール から S3 のページへいき、「バケットを作成する」をクリック
バケット名とリージョンを記入し、「次へ」クリック
S3 バケット命名規則
バケット名には命名規則がある。
(以前は、米国東部(バージニア北部) リージョンの命名規則は緩かったが、 2018 年 3 月 1 日以降全リージョンで DNS 準拠の命名規則が適用される。)- バケット名は全世界で一意
- 3 ~ 63 の文字長
- 小文字、数字、ピリオド(.)、ダッシュ(-) のみを使用可
- バケット名の始まりと終わりは、小文字の英数字のみ使用可
- 連続するピリオド、隣接するピリオドとダッシュは不可
- IP アドレス ( 00.00.000.00 )形式は不可
プロパティは、必要があれば設定し(後から変更できる)、「次へ」クリック
アクセス許可も必要であれば設定し(後から変更できる)、「次へ」クリック
デフォルトでは「パブリックアクセスをすべてブロック」がオンになっている(推奨設定)。
(アクセスコントロールとか、ボリシーとかいろんなとこでアクセス制御できるので、どこかで誤って公開設定にしてしまっても、公開をブロックするためらしい。)確認画面で「バケットの作成」をクリック
これでロールが作成された
IAM コンソールのロールの画面に作成したロール名が表示されていることを確認する
IAM ロールを作成
IAM コンソール画面から、「ロール」をクリックし、次の画面で「ロールの作成」をクリック
使用するサービスから「 EC2 」を選択し、「次のステップ:アクセス権限」をクリック
「 AmazonS3FullAccess 」を選択し、「次のステップ:タグ」をクリック
(「ポリシーのフィルター」に s3 って入力するとすぐ見つかるよ)ロール名を入力し、「ロールの作成」をクリック
これでロールが作成された
IAM コンソールのロール画面に、作成したロール名が表示されていることを確認する
IAM ロールを EC2 に割り当て
古い情報だと、 EC2 インスタンス作成時しか IAM ロールを割り当てられないとあるが、現在は作成済み・起動中のインスタンスに割り当てることができる。
インスタンス一覧画面でロールを割り当てたいインスタンスをチェックし、「アクション」→「インスタンスの設定」→「 IAM ロールの割り当て/置換」を選択
「 IAM ロール* 」から作成したロール名を選択し、「適用」をクリック
「成功しました」というメッセージが表示されれば、割り当て完了
これで、この EC2 インスタンスから、コマンドまたはプログラムから S3 バケットにアクセスが可能となる。
AWS SDK からアクセスするときの注意点
例えば AWS SDK を使って S3 にアクセスする場合で、 IAM ユーザー等の credentials の使用が必要な場合は、 S3 インスタンス生成時に credentials (アクセスキーとシークレットアクセスキー)を渡す必要があるが、ロールを使う場合には渡さないこと。
認証情報を読みにいく順番があって、 AWS SDK for PHP の場合は以下の順番で検索される。
- 環境変数
- 認証情報ファイル(サーバー上に置いてある credentials ファイル)
- IAM ロール
IAM ロールを検索しにくる順番は最後なので、コード上に credentials を渡そうすると記述があると認証情報ファイルを参照しようとしてエラーとなる。
公式ドキュメント には、「ほとんどの PHP コード例では、認証情報ファイルを使った方法を使用しています。」と書かれている。