Memo/AmazonWebServices/S3

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/S3
 

S3(Simple Storage Service)

  • Element Descriptions Version, Statement, Sid, Effect, Principal, Action, NotAction?, Resource, NotResource?, Condition, This section describ

ストレージクラスとライフサイクル

ログを保存するS3 bucketはそのままだと、保存容量が増え続けて、月額費用も上がり続けるためライフサイクルを設定したほうが良い。

  • 例: ログ保存用のバケットのlifecycleの場合
    • AbortIncompleteMultipartUpload? を7日に設定
    • 30日経過後、STANDARD_IA へ移動(オブジェクトサイズ128KB、最低利用30日)
    • 90日経過後、GLACIER へ移動(最低利用90日。再取得するには、3〜5時間かかる)
    • 365日経過後、削除

S3ベースでカスタムドメイン、SSL、IP制限

S3 Web hostingでは、SSLやIP制限は可能だが、カスタムドメインの設定ができない。
CloudFront?経由だとカスタムドメイン設定が出来る。WAFでIP制限を行う。

  1. Route53で名前解決
  2. CloudFront?
    • WAFでIP制限
      • Allow: 許可IPリスト
      • Deny: all
    • ACMにSSL証明書をインポート
      • SSL: *.example.com
    • Aliasを設定
      • my-s3-bucket.example.com
  3. S3で静的ファイル配信
    • s3://my-s3-bucket/
    • ACLはPrivateで、web hostingは使用しない。

S3対応ツール

  • WinSCP:Download オープンソース。GUI。v5.13以降でS3に対応。言語ファイル追加で日本語UI対応
    • 接続時にバケット名の指定ができないため、"s3:ListAllMyBuckets?"権限が必要。

linuxファイルシステムとしてマウント


S3でyumリポジトリ構築

  • 必要な要素
    • [S3 WebHosting?] rpmファイルを公開
    • createrepoコマンドでrpm metaデータ生成。EC2で行う?
    • [オプション] basic認証等も付けられる

s3cmdで"ERROR: S3 error: The provided security credentials are not valid."

  • Cloudian使用時に発生する S3互換のストレージサービス
    s3cmd ls s3://bucekt-name
    ERROR: S3 error: The provided security credentials are not valid.
  • 解決
    echo "signature_v2 = True" >> ~/.s3cfg

s3cmdで"WARNING: Redirected to..."

  • エラー
    s3cmd ls s3://com.example.www/
    WARNING: Redirected to: com.example.www.s3-us-west-2.amazonaws.com
  • 修正
    vim ~/.s3cfg
    ----
    bucket_location = us-west-2
    host_base = s3-us-west-2.amazonaws.com
    host_bucket = %(bucket)s.s3-us-west-2.amazonaws.com
    simpledb_host = sdb.us-west-2.amazonaws.com
    ----

S3のSSL証明書エラーの回避

  • S3のSSL証明書は'*.s3.amazonaws.com'のため、バケット名に「.」が含まれると証明書エラーになる
    cURL error: SSL: certificate subject name '*.s3.amazonaws.com' does not match target host name 'com.example.www.s3.amazonaws.com'
  • 回避方法
    • S3バケット名に"."を使わない。バケットの制約と制限 - Amazon Simple Storage Service
    • SSLを使わず、httpで通信すれば解消する
      $s3->use_ssl = false; // SSLを使わない
    • メソッドによっては、cURLのオプションでSSL証明書のチェックをしない
      $ret = $s3->list_buckets ( array(
          "curlopts" => array(CURLOPT_SSL_VERIFYPEER => false),
      ) );

バケット毎にオブジェクトの有効期限(自動削除)

  • バケット毎に100個までルールを追加できる
  • prefix: 削除対象のバケット名を除いたフルパスの前方一致を指定。ワイルドカードや正規表現は指定できない。指定しなければ全オブジェクトが対象
    • 同じパスを含むprefixは指定できない。例:「logs/」「logs/2013」
  • 一定期間をすぎたオブジェクトをGlacierに移動もできる
  • 例:com.example.wwwバケットの「group01/logs」以下を対象に、作成日から7日経過したオブジェクトを消したい
    \---com.example.www
        \---group01
            \---logs
                \---2013
                    \---01
                        +---01
                        |   +---server01
                        |   |       message.log
                        |   |       
                        |   \---server02
                        |           message.log
                        |           
                        \---02
                            +---server01
                            |       message.log
                            |       
                            \---server02
                                    message.log
  1. 対象バケットを選択して右クリック > Properties > Lifecycle
  2. Add rule
    • Enabled: チェック
    • Name: delete logs(適当)
    • Prefix: group01/logs/
    • Time Period Format: Days from the creation date (オブジェクトの生成日) または Effective from date(任意の日)
    • Expiration: 7 days (7日すぎたら削除)
  3. Save
  4. 確認
    • Manegement Console: message.log の Propertiesに「Expiry Date: Thu Dec 06 09:00:00 GMT+900 2012」
    • ObjectをGET/HEADしたときのHTTP Headers に「x-amz-expiration: expiry-date="Thu, 06 Dec 2012 00:00:00 GMT", rule-id="delete logs"」

別アカウントに許可する

  • 以前はS3FoxでEdit ACL > Share > With UserID でAWSアカウントID(数字の羅列)を入力すれば良かったがエラー「Undefined」になる(2012-11-14現在)
    ただし、一度ManegementConsole?で設定すればRead/Write個別に設定できる
  • AWSアカウント user1@example.com の com.example.user1 バケットを AWSアカウント user2@example.com(AWSアカウント番号:123456789012) と共有する例
  1. user1でAWS Manegement Consoleにログイン
  2. S3 > com.example.user1 > properties
  3. Permissions Tab > Edit bucket policy
    {
      "Id": "Policy0000000000000",
      "Statement": [
        {
          "Sid": "Stmt1000000000000",
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::123456789012:user/iam-user-name"
            ]
          },
          "Action": [
            "s3:GetObject",
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::com.com.example.user1",
            "arn:aws:s3:::com.com.example.user1/*"
          ]
        }
      ]
    }
  4. Save
  • 以下ではListBucket?は成功するが、GetObject?が成功せず
  1. Add more permissions に「user2@example.com」を入力
  2. Grantee: user2@example.com / List,Upload/Delete 等にチェック
  3. Save

特定バケットのみ許可

  • さらに "hoge/*" 以下だけ許可。以下の書き方では"hoge"にはマッチしない。StringLike?は"s3:ListBucket?"他特定メソッドにだけ使える
    {
      "Statement": [
        {
          "Sid": "Stmt0000000000001",
          "Action": [
            "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::com.example.test",
            "arn:aws:s3:::com.example.test/*"
          ],
          "Condition": {
            "StringLike": {
              "s3:prefix": [ "hoge/*"]
            }
          }
        },
        {
          "Sid": "Stmt0000000000002",
          "Action": [
            "s3:GetObject"
          ],
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::com.example.test/hoge/*"
          ]
        },
      ]
    }

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-20 (木) 14:35:18 (5d)