amareloのブログ(仮)

IT系勉強会で感じた想いや知見をメインに書いていきます。

JAWS-UG CLI専門支部 #169R S3基礎 バージョニング 参加レポート

10/8、JAWS-UG CLI専門支部にてS3バージョニングのハンズオンを受講しましたので、参加レポートを書いていきます。

目次

イベントページ

jawsug-cli.connpass.com

S3概要

S3については前回も触れましたので、今回はバージョニングに関係するところを書きます。

  • S3全体が名前空間のため、グローバルユニーク
  • オブジェクトの名前スキーマ
  • バージョニング使うか?
    • バケットの中身は使い捨てで、バケットの外でバージョン管理をする(バージョニングを使わない)。
    • または、バケットの中身をマスターとしてバケットでバージョン管理をする。
  • 以下はバージョニングを利用する機能であり、ユーザが勝手に上書きや削除等をできないようにする。監査に使える。
    • オブジェクトロック
      • リテンションモード
      • リーガルホールド
  • gitのように差分を保管しているわけではないので、バージョン指定で削除しても、他のバージョンには何の影響もない。

ハンズオン

手順と構成図

手順一式はこちらです。また、今回のハンズオン構成図は以下の通りです。

http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-s3_versioning/_images/handson-basic-versioning.png

コマンド

前回同様、保守担当者想定のIAMユーザ作成に関するコマンドは割愛します。

バージョン管理用S3バケットの構築

まずは、S3バケットを作成します。

aws s3api create-bucket \
--bucket ${S3_BUCKET_NAME} \
--create-bucket-configuration "LocationConstraint=${S3_BUCKET_LOCATION}"

以下の通り表示されたらOKです。

{
    "Location": "http://handson-cli-s3-versioning-XXXXXXXXXXXX.s3.amazonaws.com/"
}

作成確認は、S3バケット名${S3_BUCKET_NAME}が存在することを確認します。 作成したバケット名が表示されればOKです。

aws s3api list-buckets --query "Buckets[?Name == \`${S3_BUCKET_NAME}\`].Name" \
--output text

S3バケット名${S3_BUCKET_NAME}が指定のリージョンにあることを確認します。 作成時に指定したリージョン(今回は東京リージョン)が表示されれば、OKです。

aws s3api get-bucket-location \
--bucket ${S3_BUCKET_NAME} \
--output text
IAMポリシーの作成とIAMグループへのアタッチ

S3バケットにアクセスするためにポリシーを作成します。 IAMユーザ作成関連のコマンドは割愛しましたが、今回からポリシ作成とアタッチの手順が変わりましたので、復習のためにこの部分は書きます。

iam create-policy でIAMポリシーパスを指定してIAMポリシーを作成します。 エラーが表示されなければOKです。

aws iam create-policy \
--policy-name ${IAM_POLICY_NAME} \
--path ${IAM_POLICY_PATH} \
--policy-document file://${FILE_IAM_POLICY_DOC} \
--description "${IAM_POLICY_DESCRIPTION}"

iam list-policies でポリシの存在確認をします。 作成したポリシ名が表示されればOKです。

aws iam list-policies \
--scope Local \
--path-prefix "${IAM_POLICY_PATH}" \
--max-item 1000 \
--query "Policies[?PolicyName == \`${IAM_POLICY_NAME}\`].PolicyName" \
--output text                           

ポリシを設定済のグループにアタッチします。 エラーが表示されなければOKです。

aws iam attach-group-policy \
--group-name ${IAM_GROUP_NAME} \
--policy-arn ${IAM_POLICY_ARN}

アタッチされたことを、iam list-attached-group-poilcies で確認します。 作成したポリシ名が表示されればOKです。

aws iam list-attached-group-policies \
--group-name ${IAM_GROUP_NAME} \
--query "AttachedPolicies[?PolicyArn == \`${IAM_POLICY_ARN}\`].PolicyName" \                  
--output text

S3バケットにアクセスします。0が返されればOKです。

aws s3 ls s3://${S3_BUCKET_NAME} > /dev/null 2>&1 
echo $?

最後に環境変数を削除して、プロファイルの権限を無効にします。

export -n AWS_DEFAULT_PROFILE
S3バケットのバージョニング有効化

s3api put-bucket-versioning でS3バケットのバージョニングを有効(Enabled)にします。 エラーが返されなけばOKです。

aws s3api put-bucket-versioning \
--bucket ${S3_BUCKET_NAME} \
--versioning-configuration Status=Enabled

s3api get-bucket-versioning でバージョニングが有効であることを確認します。 Enabledと表示されればOKです。

aws s3api get-bucket-versioning \
--bucket ${S3_BUCKET_NAME} \
--query 'Status' \
--output text

マネージドコンソールを確認すると、対象のS3バケットのプロパティにて、バージョニングが有効(紫色のチェックが入っている)になっていることが確認できます。

f:id:amarelo-n24:20201010173119p:plain

動作確認

ここから動作確認していきます。 まずはS3バケットにオブジェクトをアップロードします。

aws s3 cp ${FILE_LOCAL} s3://${S3_BUCKET_NAME}/${S3_OBJECT_KEY}

以下のように表示されたらOKです。

upload: ${HOME}/environment/local-handson-cli-s3/handson-cli-s3.txt to s3://handson-cli-s3.txt

S3バケットにオブジェクトが存在することを確認します。 0と表示されます。

aws s3 ls s3://${S3_BUCKET_NAME}/${S3_OBJECT_KEY} \
  > /dev/null 2>&1
echo $?

アップロードしたファイルを更新後、s3 cpコマンドで再度アップロードします(コマンドは割愛)。

次にバージョンを指定してダウンロードします。 オブジェクトのバージョンIDを取得します。 文字列が表示されたらOKです。

S3_OBJECT_VERSION_ID=$( \
aws s3api list-object-versions \
--bucket ${S3_BUCKET_NAME} \
--prefix ${S3_OBJECT_KEY} \
--query "reverse(sort_by(Versions, &LastModified))["${COUNT_OLDER}"].VersionId" \
--output text \
) \
&& echo ${S3_OBJECT_VERSION_ID}

指定したバージョンのオブジェクトをダウンロードします。

aws s3api get-object \
--bucket ${S3_BUCKET_NAME} \
--key ${S3_OBJECT_KEY} \
${FILE_S3_OBJECT_OUTPUT} \
--version-id ${S3_OBJECT_VERSION_ID}

以下のように表示されるとOKです。

{
    "AcceptRanges": "bytes",
    "LastModified": "Thu, 08 Oct 2020 10:05:16 GMT",
    "ContentLength": 7,
    "ETag": "\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"",
    "VersionId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "ContentType": "text/plain",
    "Metadata": {}
}

バージョンを指定して削除します(手順では最新バージョン(0)を削除しました)。

aws s3api delete-object \
--bucket ${S3_BUCKET_NAME} \
--key ${S3_OBJECT_KEY} \
--version-id ${S3_OBJECT_VERSION_ID}

以下のように表示されればOKです。

※yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyに${S3_OBJECT_VERSION_ID}の値が表示されます。

{
  "VersionId": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}

指定の世代のバージョンが存在しないことを確認します。 s3api list-object-versions を入力して、何も表示されなければOKです。

aws s3api list-object-versions \
--bucket ${S3_BUCKET_NAME} \
--prefix ${S3_OBJECT_KEY} \
--query "Versions[?VersionId == \`${S3_OBJECT_VERSION_ID}\`].VersionId" \
--output text

バージョニングの動作確認をしたら、すべてのバージョンを削除します。 すべてのバージョンを削除するには、バケットに残っているオブジェクトのバージョンを取得し、for文でバージョン数分のs3api delete-object を実行します。

for i in $(
  aws s3api list-object-versions \
    --bucket ${S3_BUCKET_NAME} \
    --prefix ${S3_OBJECT_KEY} \
    --query "Versions[].VersionId" \
    --output text \
); do
  aws s3api delete-object \
    --bucket ${S3_BUCKET_NAME} \
    --key ${S3_OBJECT_KEY} \
    --version-id ${i}
done

オブジェクトにバージョンが存在しないことを確認します。

! aws s3api list-object-versions \
--bucket ${S3_BUCKET_NAME} \
--prefix ${S3_OBJECT_KEY} \
--query "length(Versions)"

以下のように表示されたらOKです。

In function length(), invalid type for value: None, expected one of: ['string', 'array', 'object'], received: "null"
バージョニングの無効化

バージョニング有効化にした時と同様、`s3api put-bucket-versioning'でバージョニングを無効化(Suspended)にします。

aws s3api put-bucket-versioning \
--bucket ${S3_BUCKET_NAME} \
--versioning-configuration Status=Suspended

s3api get-bucket-versioningバケットの状態を確認します。Suspendedと表示されればOKです。

aws s3api get-bucket-versioning \
--bucket ${S3_BUCKET_NAME} \
--query 'Status' \
--output text

また、マネージドコンソールを確認すると、対象のS3バケットのプロパティにてバージョニングが有効(紫色のチェック)だったのが、無効(チェックの色が灰色)になっていることが確認できます。

f:id:amarelo-n24:20201010173500p:plain

バージョン管理用S3バケットの破棄

s3api delete-bucket でS3バケットを削除します。

aws s3api delete-bucket --bucket ${S3_BUCKET_NAME}

削除したS3バケットが存在しないことを確認します。

aws s3api list-buckets \
--query "Buckets[?Name == \`${S3_BUCKET_NAME}\`].Name" \
--output text

手順は割愛しますが、保守担当者想定のIAMユーザを始めアクセスキー、IAMグループを削除して完了です。

最後に

バージョニングは、S3オブジェクトの変更履歴を厳密に管理する目的があるならば使えるかもしれませんが、そうでもなければあまり使わないかなと思いました。しかし、このような仕組みがあるということをちゃんと覚えておいた方が、自分の引き出しが増えて良いと思いました。バージョニングについてはSAAの勉強時にも触れましたが、今回のハンズオンを受けるまではそのような機能があったことを忘れていました(汗)理解していたつもりになっていたなぁと思い反省しています。

CLI専門支部AWSの勉強を続けてそろそろ半年。こうやって続けられているのは、やはり「AWSが好きなのかな?」「CLIが好きなのかな?」と思ってきました。そろそろ、独自てAWSを使った何かを実現して、LT登壇ネタ、ブログのネタにできればなぁと思います。