AWS CLIを使って、Amazon S3で静的ウェブサイトをホスティングしたい

AWS CLIのs3コマンドとs3apiコマンド、s3apiコマンドとs3controlの区別がなかなかつかず、詰まりました。 後ろに付けるパラメータで予測をつけるということを学びました。 実際にGUIでやってから触ったのですが、GUIだと見なかったところを触れたのでこんなこともできるのかと発見もあったので、寄り道できる間は寄り道も大事かなと思いました。 AWS CLIもっと慣れたいです。
2020.05.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、どうもたいがーです?
入社してもうすぐ丸二か月が経つそうです。時間が経つのは早いですね。

AWS CLIを使うのが楽しくなってきた、今日この頃。
今やっていることも、CLIを使ってできないのかな・・・なんて考えています。

そんな今回は、AWS CLIを使ってAmazon S3を操作し、静的ウェブサイトのホスティングをやっていきたいと思います。

実行環境

  • AWS CLI v2.0.14

やってみよう

手順をざっくりまとめると、このような感じです。

  1. 公開用のS3バケットを作成。そのバケットのアクセスブロックを確認し、設定する
  2. バケットポリシーを作成、S3バケットにアタッチする
  3. テストページ用のhtmlファイルを作成し、S3バケットにアップロードする
  4. S3バケットにウェブサイトの設定を行う

公開用のS3バケットを作成。そのバケットのアクセスブロックを確認し、設定する

  • 公開用にS3バケットを作成します。バケットの命名規約等はこちらをご覧ください。
    aws s3 mb s3://[backet-name]

  • for-test-pageバケットのアクセスブロックを設定し、公開できる状態にします。

    aws s3api put-public-access-block --bucket [backet-name] --public-access-block-configuration  "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"

  • きちんと反映できているか、確認してみましょう。

    aws s3api get-public-access-block --bucket [backet-name]

{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}

指定した通りになっていますね。
次に進みましょう。

バケットポリシーを作成、S3バケットにアタッチする

  • 公開するためのバケットポリシーを作成します。 今回はbucket-policy.jsonという名前で作成しました。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow", 
                "Principal": "*", 
                "Action": "s3:GetObject", 
                "Resource": "arn:aws:s3:::for-test-page/*" 
            } 
        ] 
    }

  • S3バケットに先程作成したポリシーをアタッチします。

    aws s3api put-bucket-policy --bucket [backet-name] --policy file://bucket-policy.json

テストページ用のhtmlファイルを作成し、S3バケットにアップロードする

  • テストページ用のhtmlを作成します。 今回はindex.htmlという名前で作成しました。

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
                <title>test page</title>
        </head>
        <body>
            This is test page:) Tada-!
        </body>
    </html>

  • 先程作成したファイルをS3バケットにアップロードします

    aws s3 cp index.html s3://[backet-name]/index.html

S3バケットにウェブサイトの設定を行う

こちらですが、2種類の方法があります。

  • s3コマンドを使う
  • s3apiコマンドを使う

どちらでも公開できますが、今回のように静的サイトを公開したいだけの場合は前者を使うことをお勧めします。 指定したファイルがなかった場合、ファイルがないとコマンドライン上にエラーメッセージが出るので、ミスを防ぎやすいためです。

API レベルコマンド (s3api コマンドセットに含まれる) は、Amazon Simple Storage Service (Amazon S3) API への直接アクセスを許可し、高レベルの s3 コマンドで公開されていない一部のオペレーションを有効にします。これらのコマンドは、サービスの機能性への API レベルのアクセスを提供する他の AWS サービスに相当します。
~AWS CLI での API レベル (s3api) コマンドの使用より~

[方法1]指定したS3バケットにwebsiteの設定を行う

aws s3 website s3://[backet-name] --index-document index.html

[方法2]公開するウェブサイトの設定を記載し、バケットに設定する

  • 公開するウェブサイトの設定を記載します。 今回は、website.jsonという名前でファイルを作成しました。
{
    "IndexDocument": {
        "Suffix": "index.html"
    }
}
  • インデックスドキュメントを設定します。
aws s3api put-bucket-website --bucket [backet-name] --website-configuration file://website.json

ブラウザ上で確認してみる

ブラウザ上で表示されるか、確認します。
URLはhttp://[bucket-name].s3-website-[region].amazonaws.comです。

無事、表示されました!

個人的に引っかかったところ

s3apiとs3controlの違い

途中に載せているput-public-access-blockの設定をしている時です。
最初、s3apiではなく、s3controlコマンドでブロック設定を変更していました。

aws s3control put-public-access-block --account-id 123456789012 --public-access-block-configuration '{"BlockPublicAcls": false, "IgnorePublicAcls": false, "BlockPublicPolicy": false, "RestrictPublicBuckets": false}'

s3controlは、アカウントIDで指定する、つまりアカウント自体のブロック設定が変更されます。
ちなみに、s3controlで上記のAclsを全てtrueに設定しますと、アカウント自体のブロック設定が全てオンになります。

全てtrueにした状態で、マネジメントコンソールで確認するとこのようなメッセージが表示されています。

このアカウントに対してパブリックアクセスのブロック設定が有効になっていると、パブリックアクセスが許可されません。

アカウントにある全てのバケット内のオブジェクトが公開されないように変更されるので、みなさんはご注意ください。

最後に

ようやく、AWS CLIも慣れてきた気がします。
が、まだまだ不慣れなところも多いので、ガンガン触っていきたいと思います!

以上、たいがーでした!