[AWS] S3作成とIAMロールでEC2からS3にアクセスする

環境AWS,セキュリティ

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 バケットの作成

  1. AWS マネジメントコンソール から S3 のページへいき、「バケットを作成する」をクリック

    Amazon S3 Console Page
    Amazon S3 Console Page
  2. バケット名とリージョンを記入し、「次へ」クリック

    Amazon S3 Create a Bucket
    Amazon S3 Create a Bucket

    S3 バケット命名規則

    バケット名には命名規則がある。
    (以前は、米国東部(バージニア北部) リージョンの命名規則は緩かったが、 2018 年 3 月 1 日以降全リージョンで DNS 準拠の命名規則が適用される。)

    • バケット名は全世界で一意
    • 3 ~ 63 の文字長
    • 小文字、数字、ピリオド(.)、ダッシュ(-) のみを使用可
    • バケット名の始まりと終わりは、小文字の英数字のみ使用可
    • 連続するピリオド、隣接するピリオドとダッシュは不可
    • IP アドレス ( 00.00.000.00 )形式は不可
  3. プロパティは、必要があれば設定し(後から変更できる)、「次へ」クリック

    Amazon S3 configure options
    Amazon S3 configure options
  4. アクセス許可も必要であれば設定し(後から変更できる)、「次へ」クリック

    Amazon S3 set permissions
    Amazon S3 set permissions

    デフォルトでは「パブリックアクセスをすべてブロック」がオンになっている(推奨設定)。
    (アクセスコントロールとか、ボリシーとかいろんなとこでアクセス制御できるので、どこかで誤って公開設定にしてしまっても、公開をブロックするためらしい。)

  5. 確認画面で「バケットの作成」をクリック

    AWS S3 review
    AWS S3 review
  6. これでロールが作成された
    IAM コンソールのロールの画面に作成したロール名が表示されていることを確認する

IAM ロールを作成

  1. IAM コンソール画面から、「ロール」をクリックし、次の画面で「ロールの作成」をクリック

    IAM Management Console
    IAM Management Console
  2. 使用するサービスから「 EC2 」を選択し、「次のステップ:アクセス権限」をクリック

    AWS Create an IAM Role
    AWS Create an IAM Role
  3. 「 AmazonS3FullAccess 」を選択し、「次のステップ:タグ」をクリック
    (「ポリシーのフィルター」に s3 って入力するとすぐ見つかるよ)

    IAM Role Attach Policies
    IAM Role Attach Policies
  4. ロール名を入力し、「ロールの作成」をクリック

    Input an IAM Role Name
    Input an IAM Role Name
  5. これでロールが作成された
    IAM コンソールのロール画面に、作成したロール名が表示されていることを確認する

IAM ロールを EC2 に割り当て

古い情報だと、 EC2 インスタンス作成時しか IAM ロールを割り当てられないとあるが、現在は作成済み・起動中のインスタンスに割り当てることができる。

  1. インスタンス一覧画面でロールを割り当てたいインスタンスをチェックし、「アクション」→「インスタンスの設定」→「 IAM ロールの割り当て/置換」を選択

    Attach the IAM role to an existing EC2 instance
    Attach the IAM role to an existing EC2 instance
  2. 「 IAM ロール* 」から作成したロール名を選択し、「適用」をクリック

    Select an IAM Role
    Select an IAM Role
  3. 「成功しました」というメッセージが表示されれば、割り当て完了

これで、この EC2 インスタンスから、コマンドまたはプログラムから S3 バケットにアクセスが可能となる。

AWS SDK からアクセスするときの注意点

例えば AWS SDK を使って S3 にアクセスする場合で、 IAM ユーザー等の credentials の使用が必要な場合は、 S3 インスタンス生成時に credentials (アクセスキーとシークレットアクセスキー)を渡す必要があるが、ロールを使う場合には渡さないこと。

認証情報を読みにいく順番があって、 AWS SDK for PHP の場合は以下の順番で検索される。

  1. 環境変数
  2. 認証情報ファイル(サーバー上に置いてある credentials ファイル)
  3. IAM ロール

IAM ロールを検索しにくる順番は最後なので、コード上に credentials を渡そうすると記述があると認証情報ファイルを参照しようとしてエラーとなる。

公式ドキュメント には、「ほとんどの PHP コード例では、認証情報ファイルを使った方法を使用しています。」と書かれている。

Posted by Agopeanuts