amareloのブログ(仮)

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

オンラインでMicrosoft Azure Fundamentals(AZ-900)を受験しました

先日、Microsoft Azure Fundamentals(AZ-900)を受験しました。 このご時世ですので、試験会場に行くよりはオンラインで受験できるならば、ということでオンラインで受験しました。 これからオンライン受験する方もたくさんいると思いますので、少しでも参考になればと思い、 オンライン受験したこと、自分がやった対策について書こうと思います。

※2020年10月時点での情報です。

目次

Microsoft Azure Fundamentals(AZ-900)とは

Azure Fundamentals (AZ-900)は、クラウドの概念、 Azure サービス、 Azure ワークロード、 Azure のセキュリティとプライバシー、 Azure の価格とサポートに関する知識を証明するための試験です。

docs.microsoft.com

受験のキッカケ

私は、AWS認定を2つ(クラウドラクティショナー、ソリューションアーキテクトアソシエイト)を取得しています。 次のAWS認定受験を何にするか迷っていたところでしたが、Azureについても基礎的なことは知っておきたい、AWSとの違いを知りたいと思い、勉強することにしました。

試験対策

Microsoft Azure Virtual Training Day: Fundamentals受講

Microsoftが主催するAZ-900受験バウチャー付きのセミナーに参加しました。 2日間できる限りメモを取り集中して受講しました。 2日間受講したら、AZ-900無料受験の権利を得ることができます。

今は開催されているのかは分かりませんが、見つけたらとにかく申し込んで受講してみるのが良いと思います。また、無料受験の権利がいつまで有効かもわかりませんが、受講したらなるたけ早めに受験申し込みすることをお勧めします。 私は7月末に受講して10月前半に受験申し込みと3か月弱開いてしまいましたが、無料受験申し込みできました。

書籍

「合格対策 Microsoft認定 AZ-900:Microsoft Azure Fundamentalsテキスト&問題集」

今のところこれしかありません。AZ-900受験の際はこれを買いましょう! とても良くまとめられていて、要領を抑えるには適切だと思います。 模擬試験1回分も収録されているため、予行演習としても最適です!

セミナー受講後はこれとMicrosoft Learnを合わせて取り組みました。

Microsoft Learn

docs.microsoft.com

Web上でMicrosoft社のサービスに係る学習コンテンツです。 AZ-900で扱うことには一通り触れられています。 また、サンドボックス環境を使ったハンズオンもありますので、Azure使ったことない人でも気軽に使えて理解が深まると思います。

Microsoft公式ドキュメントを読む

参考書とLearnでは不十分かなと思ったサービスについては、深堀りするために読みました。 AWSの勉強もそうですが、Azureでも公式のドキュメントを読むのは重要です。

オンライン受験申し込み

ピアソン(Pearson VUE)で申し込み可能ですが申し込み前に、

  • 誰も入ってこれないようにできる部屋があること
  • 手の届くところに本と筆記用具を置ける場所がないこと
  • 十分な帯域のネットワーク環境(LANは無線より有線の方が望ましい。モバイルWifiはNG)
  • Webカメラとマイクが動作可能であること

を確認すべきです。 Webマイクとカメラは申込時に簡易的なシステムチェックがありますので、それで確認すればわかります。 部屋が用意できない等、上記ポイントの確保が怪しいと思ったら、オンライン受験を断念した方が良いかもしれません。当日受験できないことになっても返金されないためです。

自分は変な指摘をされる隙を作りたくなかったので、部屋にあるすべての筆記用具と書籍類、プリンタなどPC周辺機器はすべてウォークインクローゼットに疎開させました。そこまで徹底する必要はなかったかもしれませんが、試験直前にトラブって焦るのも嫌だったので…

なお、2020年10月現在、受験日は平日しか指定できません。仕事の調整は必須です。 私は受験費免除のバウチャーがあったのでクレカ番号の入力はありませんでしたが、通常ならば支払いにクレカが必要です。

当日の手続き

事前に身分証明書を用意します。国が発行した証明書が必要です。免許証かパスポートのどちらか1つがあればOKです。

ピアソンの試験予約ページより30分くらい前から試験準備可能です。 まずは、

  • 受験PC周りを写真撮ってアップ
  • 身分証明書(免許証かパスポート)を写真撮ってアップ
  • PCを持って部屋360°Webカメラで映す

ことを要求されます。 焦ることのないように、試験開始前の手続きは試験30分前から余裕持って実施することをお勧めします。私も30分くらい前から開始しましたが、写真撮ってアップするところで手間取り、15分くらいかかってしまいました。

試験管とのやり取りは音声ではなく、チャットでの会話となります。日本語対応可能なため、特に不便はありませんでした。 問題なければ時間まで待機し、時間になったら試験開始となります。

試験結果

700点合格のところ、760点合格でした!

嬉しかったけど、結構ギリでヒヤッとしました…(汗)

感想

オンライン受験について

受験した日は家族が仕事や学校に行っていて誰もいなかったので、邪魔が入らずにスムーズに受験できました。 試験途中、外で工事をしていた音が入ってきたのにはちょっと気をそらされましたが、概ね良好に受験できたかなと思っています。 合格が分かりWebカメラの監視が終了してすぐに「よっしゃぁーーー!」と叫びましたw 嬉しくても悲しくても、試験結果がわかってから人目を気にせず感情をあらわにできるのもいいところですねwww

受験結果について

合格したことは嬉しいけど、SAAやプラクティショナーの時と比べて自信があったのに合格ラインギリだったので複雑な気持ちです。 勉強して理解していたつもりでしたが、やはり実践に勝るものはありません。 出来れば30日間の無料期間を有効活用して理解を深めた方がよいです。 上位資格を狙う時に使いたいと思い、今回は無料期間利用を見送りましたが、ケチってはいけないですね…

Azureも試験だけで終わらず、今後も勉強し続けたいです!

最後に

コロナ禍の状況で試験会場に行くのも憚れる時代ですが、受験したい認定試験がオンライン化しているのは嬉しい限りです。 オンラインで安心して資格試験を受験できる環境がもっと広まると良いなぁと今回の受験で思いました。今後も活用していきたいです。

オンライン受験も人によって向き不向き、環境による可否はあると思いますので、「お勧めします」とは言いづらいです。しかし、

  • リモートワークが好き、または許容できている
  • 試験会場まで行くのが面倒
  • 部屋が片付いている(or 片付けることが面倒ではない)
  • コロナ感染が不安

という人は、オンライン受験を検討してみても良いと思います!!

はじめての〇〇 超LT会- vol.1 #ultralt で超LTしました

10/14 「はじめての〇〇 超LT会- vol.1 #ultralt」に登壇してきました。 久々の登壇でしたが無事終了しました!取り急ぎ感想を書きます。

目次

イベントページと概要

こちらです。1人1分の超ライトニングトークで、はじめての経験をネタに31人が登壇しました。

rakus.connpass.com

登壇資料

元ネタは以前ブログにも書いたトラックボールデビューした話です。今年はじめての経験をして印象に残っているのがこれだったので。

speakerdeck.com

感想

自分の登壇について

冒頭書いた通り久々の登壇でした(今年の3月にインフラ勉強会でLT登壇して以来)ので、練習でも詰まったり1分オーバーしたりと…ブランクを感じました(汗) LTは何とか1分で終わることができました。1分とはいえ時間を貰って話すわけですし、ちゃんと練習しておいて良かったです。練習大事!!

自分の番になりZoomの画面共有に若干もたつきました。Zoomでオンラインイベントに参加するなど、参加者側として使うのは多かったですが、 実際に画面共有したのはじめてでした。何でもやってみないと分かりませんね…でも、今回それを経験できたのはホント良かったです。

登壇前はトラックボールの話だとインパクト薄いかな~と思いましたが、意外にも休憩時間中のフリートークでもトラックボールのことが話題になってたところを見た時は、やはり話してよかったと思いました! また、SW-M570は名器ということもわかりました。やはり使っている人多いですね。

他の方々のLTを聞いて

1分のLTは緊張感があって面白いですが、他の方の登壇もあっという間に終わってしまうので、聞く方も集中して聞く必要があります。 聞く方に集中しすぎるとツイート実況できなかったり、メモできなかったり… そのため、全登壇者の感想を書くことはできそうもないです。スイマセン… 一部登壇者のお話を聞いてから思ったことを簡単に書かせていただきます。

  • 1分のLTでももう少し資料枚数作った方が良かったかな?(全体を通して。自分の資料は2ページだったのでw)
  • WSL1とWSL2の違いはちゃんと抑えよう(@YKanoh65さん はじめてのWSL2より)
  • GB studio面白そう。ゲームボーイなつかしい!(@rom1000_yksbpnさん 俺の作ったゲームが、こんなにNoCodeなわけがないより)
  • カイゼンジャーニーをもう一度読みたくなってきた(@saya1001kirinnさん はじめてのスクラムより)
  • 自分もポートフォリオサイト作って公開したい(uni__82さん はじめてのポートフォリオ公開より)
  • エンジニアの成長を応援する本2の感想書こう!自分も寄稿したし。(@maiameaさん はじめての寄稿より)
  • 個人開発もやりたい!(@itizawa_pen はじめての本格的個人開発より)
  • 動画での登壇は斬新!!(@sogaoh さん はじめてのe-Taxより)
  • ループさせたときは焦るのわかる!あと、顧客と仲良くなることと巧みな話術は大事w(@Infra_さん はじめてのループより)

雑な感想かもしれません。本当に申し訳ありません(汗)

最後に

やはりLTは楽しいですね。勉強会に自発的に参加しているという気持ちになれます。 そういえば、コロナ禍で勉強会がオンラインになったので登壇する機会はたくさんあったはずなのに、なぜ半年以上も登壇しなかったのか? オンライン登壇はインフラ勉強会でやってたから躊躇するものはなかったはずだけど… ともかく、これでオンライン勉強会の登壇(顔出し)の実績を作れたので、また積極的にLT登壇やっていきたいです!

LT登壇できて良かったです。主催のラクス様、ありがとうございました!!

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登壇ネタ、ブログのネタにできればなぁと思います。

JAWS-UG朝会 #13 参加レポート

9/28(月)JAWS-UG朝会に参加しましたので、参加レポートを書きます。

目次

イベントページ

jawsug-asa.connpass.com

セッションとLT

ラジオ体操

まずはいつも通り恒例のラジオ体操から始まりました。朝は体を動かすの大事ですね! ちゃんとPCの前でラジオ体操第一やりました!!

AWS Single Sign-Onのお話 鄭昌浩さん

prezi.com

  • AWS SSOとは2020年9月3日に東京リージョンでGAされたサービス
  • Organizationsのサブ機能的な位置づけ
  • SAML2.0準拠のクラウドアプリケーション(Datadog、GitHubなど)にシングルサインオンが可能
  • AWS Organizations マルチアカウントにシングルサインオン。それぞれのコンソールにログオン可能
    • マルチアカウントのアクセス管理、サインインが容易に
  • Organizationsの利用が前提で全機能有効化が必須
    • 有効後に作成されたアカウントでは承認処理が不要
  • AWS SSOの設定
    • MFAとポータルとなるURLの設定
    • アクセス権限セットの設定
    • アプリケーションの設定
    • グループとユーザの作成(IAMユーザとは全く別のもの)
  • アカウントを本番系、開発系で完全に分離して誤アクセス予防するなどの用途に
  • Organizationsを使っている人は使ってみては?

最後に現職を今月末(明後日)で退職して、10月からAWS社員に転職が決まっているとのこと。 おめでとうございます!!ビックリしてここまでの内容が吹っ飛びそうでしたw

Cognito、Azure ADと仲良くしてみた 近藤 恭史さん

www.slideshare.net

  • Cognito

    • Web、モバイルアプリケーション向けのユーザ認証機能を提供するサービス
    • Cognito User Pool、Cognito ID Pool、Cognito Syncがある。
      • Cognito User Poolは、ユーザ認証と管理を行う。ldp連携も可能。
  • Azure ADとは

    • Microsoftが提供しているクラウド認証サービス
    • Microsoft365を使っていると裏で動いている
  • 業務システムごとにサインイン、ユーザー管理するのは面倒

  • サインインの画面を準備するのは手間
    • Amplifyで一から作るより楽にできるけど、日本語化など手を加えることが必要になる。
  • CognitoとAzure ADで仲よくすることで解決
    • User Pool とAzure ADをSAML2.0で連携してAzure ADでユーザ管理
ClientvpnとPrivate CA 富松 広太さん

www.slideshare.net

  • ClientVPN

    • クライアント端末からVPN接続
    • AWSのネットワークに接続
    • 認証はAD認証、SAML認証、相互認証(証明書による管理なので個別に認証局の管理が必要)
  • 相互認証の証明書管理のためにAWS ACM Private CAを使ってみた。

    • 証明書の運用(ユーザ作成、失効)をできる。
    • S3に失効リストが自動作成される。
    • 証明書関連の操作に一部CLISDKが必要
    • サーバ管理不要だがかなり高額(400ドルくらい)
Permission Boundary をやっと理解できたので誰か聞いてくれ(雑) 大竹 孝昌さん

www.slideshare.net

  • Permission Boundaryはアカウント内から制御する。OrganizationsのSCPはアカウントの外から制御する。
  • 権限の委任はしたいけど特定の操作は制限したい場合にPermission Boundaryを使用。
  • ここまで条件がそろってる場合は不要
    • IAM権限を持つ人に十分なスキルがある。
    • チーム内が比較的小規模である。
    • チーム内の信頼関係が十分構築されている。
  • IAMをマスターすることは良いAWSライフを送れるための第一歩
AWSでたくさんお金を使っちゃった話 高原未菜さん

www.slideshare.net

  • Amazon様に150万円/月もの課金をしてしまった。
  • 性能測定のためにRDS/Auroraに約15TBの料金がかかっていた。

    • インスタンス停止時もストレージ料が課金されていた。
    • 停止していても7日間経過すると自動起動されるため、起動されていた。
  • 改善策

    • 性能測定データはスナップショットを作成しS3に保管する。
    • 性能測定以外はRDSをインスタンスごと削除
  • 節約術

    • DynamoDBのデフォルト設定でテーブルを作ると、未使用でも1テーブル400円くらいかかる。
    • オンデマンドにすると未使用の場合でも0円になる。未使用テーブルが8つあったので、3,000円節約できた。

150万円、額の大きさにただただ驚きでした…PoCやハンズオンが終わって作った環境を使う見込みがないならば、とにかく削除した方がいいと改めて思いました。私は個人アカウントなので、これと同じことやったらと思うと恐ろしい…

最後に

テーマを設けていなかったのにほとんど認証認可の話になったのは、それだけセキュリティ、特に認証認可に関心が強い方が多いからだと思いました。サービスを展開する上でとにかく守らなければならないところですが、今日お話を聞いていて理解不十分なことがわかりました。もう一度、SAML、SSOなど認証認可周りを勉強したくなりました。

セキュリティを勉強しなおして、AWS 認定セキュリティ-専門知識」 の取得を目指そう!その前にDVASOAか…

JAWS-UG CLI専門支部 #168R S3基礎 Webサイト&ログ 参加レポート

9/24、JAWS-UG CLI専門支部にてS3でWebサイトホスティングするハンズオンを受講しました。ここのところ仕事と重なってなかなか参加できませんでしたが、久々の参加レポートを書いていきます。

目次

イベントページ

jawsug-cli.connpass.com

S3概要

S3の正確な情報を知るには、やはり公式ドキュメントを読むのが一番だと思いますが、今回学んだことのポイントは、以下2点です。

  • S3のCLIコマンドの種類

    • ハイレベルコマンド(s3):オブジェクトやバケットの作成、操作、削除などを簡素化するUNIXベースのコマンド。
    • ローレベルコマンド(s3api):APIへの直接アクセスを許可し、ハイレベルコマンドではできないアクセス制御、Webサイト公開設定などを行う。
  • アクセス制御

    • 特定の人やリソースからのアクセスはIAMで制御する。
    • 不特定多数の人やITリソースからのアクセスは、パブリックアクセスブロック、バケットポリシ、オブジェクトACLで制御する。

S3のCLIコマンドには2種類あることは気になっていましたが、今回初めて知りました。AWS CLIユーザーガイドにも書いてあったこと、復習で読み直して知りました。まだまだ公式ドキュメントの読み込みが足りないですね(汗)気になったらすぐに知らべる癖をつけねば…

ハンズオン

手順と構成図

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

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

コマンド

構成図上、保守担当者想定のIAMユーザを作成する必要がありますが、IAMユーザ、IAMグループ、IAMポリシ作成に使ったコマンドは割愛します。S3に関するコマンドのみ書きます。

バケットの作成

s3api create-bucketバケット作成をします。バケット名とバケットの作成ロケーションを指定します。なお、先にログ用バケットを作成し、その後コンテンツバケットを作成します。

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

以下の通り結果が表示されたら作成成功です。

{
  "Location": "http://handson-cli-s3-website-logging-website-XXXXXXXXXXXX-log.s3.amazonaws.com/"
}

バケットの存在確認は、s3api list-buckets で行います。

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

コマンド実行すると、以下のように表示されます。

handson-cli-s3-website-logging-website-XXXXXXXXXXXX-log

ちなみに、オプションをつけずにs3api list-buckets を実行すると、JSON形式で以下のように表示されます。 queryオプションのJMESPathは、Buckets内のNameに${S3_BUCKET_NAME}が含まれているものを抽出するという意味です(と読み取りましたが、間違っていたらご指摘ください)。

{
    "Buckets": [
        {
            "Name": "handson-cli-s3-website-logging-website-XXXXXXXXXXX-log",
            "CreationDate": "2020-09-26T02:08:56.000Z"
        }
    ],
    "Owner": {
        "DisplayName": "XXXXXXXXXXX",
        "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    }
}

また、作成バケットのリージョンを確認します。

aws s3api get-bucket-location \
--bucket ${S3_BUCKET_NAME} \
--output text

東京リージョンに作成されている場合は、ap-northeast-1と表示されます。

ログバケットACL(アクセス権限)更新

s3api put-bucket-aclACLの設定を行います。ログ配信グループに「オブジェクトの書き込み」と「バケットのアクセス権限の読み取り」の権限を付与します。URIは、S3で定義されているログ配信グループのものです(詳しくはこちらに記載があります)。コマンド実行後にエラーが出力されなければOKです。

aws s3api put-bucket-acl \
--bucket ${S3_BUCKET_NAME} \
--grant-write 'URI="http://acs.amazonaws.com/groups/s3/LogDelivery"' \
--grant-read-acp  'URI="http://acs.amazonaws.com/groups/s3/LogDelivery"'

s3api get-bucket-acl にて、ログバケットACLが、ログ配信グループからのオブジェクト書き込み(WRITE)とアクセス権限の読み取り(READ_ACP)を許可していることを確認します。許可されている場合は、WRITE READ_ACPと表示されます。

aws s3api get-bucket-acl \
--bucket ${S3_BUCKET_NAME} \
--query 'Grants[?Grantee.URI == `http://acs.amazonaws.com/groups/s3/LogDelivery`].Permission' \
--output text
コンテンツバケットの設定

ログ設定を s3api put-bucket-logging で設定します。コマンド実行後にエラーが出力されなければOKです。

aws s3api put-bucket-logging \
--bucket ${S3_BUCKET_NAME} \
--bucket-logging-status file://${FILE_S3_BUCKET_LOGGING_DOC}

バケットログ設定が有効になっていることを s3api get-bucket-logging で確認します。

aws s3api get-bucket-logging \
--bucket ${S3_BUCKET_NAME}

設定されている場合は、コマンド実行後以下の通り表示されます。

{
  "LoggingEnabled": {
    "TargetPrefix": "Logs/",
    "TargetBucket": "handson-cli-s3-website-logging-website-XXXXXXXXXXXX-log"
  }
}

s3api put-bucket-policyバケットポリシを適用します。あらかじめ作成したポリシファイルを読み込みます。コマンド実行後にエラーが出力されなければOKです。

aws s3api put-bucket-policy \
--bucket ${S3_BUCKET_NAME} \
--policy file://${FILE_S3_BUCKET_POLICY_DOC}

バケットポリシが存在することを確認します。

aws s3api get-bucket-policy \
--bucket ${S3_BUCKET_NAME}

コマンド実行後に以下のように表示されたら成功です。

{
  "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AddPerm\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::handson-cli-s3-website-logging-website-XXXXXXXXXXXX/*\"}]}"
}

s3api put-bucket-website でWebサイトホスティング設定をします。あらかじめ作成した設定ドキュメントを読み込みます。コマンド実行後にエラーが出力されなければOKです。

aws s3api put-bucket-website \
--bucket ${S3_BUCKET_NAME} \
--website-configuration file://${FILE_S3_BUCKET_WEBSITE_DOC}

なお、設定ファイル(${FILE_S3_BUCKET_WEBSITE_DOC})は以下のJSONを読み込ませます。エラードキュメントファイルとインデックスドキュメントの設定です。

{
  "ErrorDocument": {
    "Key": "error.html"
  },
  "IndexDocument": {
    "Suffix": "index.html"
  }
}

s3api get-bucket-website でWebサイトホスティングの設定が存在することを確認します。

aws s3api get-bucket-website \
--bucket ${S3_BUCKET_NAME} \
--query "length(@)"

先のJSONを読み込ませて、エラードキュメントとインデックスドキュメントを設定しました。そのため、コマンド実行後に設定数が2 と表示されればOKです。

Webコンテンツの公開

コンテンツバケットにアクセス確認します。コマンド実行後に0が表示されればOKです。

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

s3 syncを使い、あらかじめ準備したインデックスドキュメントとエラードキュメントが格納されているドキュメントに移動し、ドキュメントをコンテンツバケットに転送します。なお、--excludeで‘git を転送対象外にしています。

dir_current=$(pwd)
cd ${DIR_S3_SYNC} \
&& aws s3 sync . "s3://${S3_BUCKET_NAME}/" \
--exclude "${S3_SYNC_EXCLUDE}" \
&& cd ${dir_current}

ドキュメントがアップされたことを、aws s3 ls s3://${S3_BUCKET_NAME}で確認します。コマンド実行後、例えば以下のように転送したドキュメントが表示されればOKです。

2020-09-25 01:23:45        186 error.html
2020-09-25 01:23:45      55560 img.jpg
2020-09-25 01:23:45        255 index.html

curlコマンドでWebサイトにアクセスできることを確認します。

curl ${S3_BUCKET_WEBSITE_ENDPOINT}

インデックスドキュメントのHTMLが表示されればOKです。

次にステータスコード200が返ってくることを確認します。

curl -LI -Ss \
-o /dev/null \
-w '%{http_code}\n' \
${S3_BUCKET_WEBSITE_ENDPOINT}
ログファイルの確認

以下の通り、ログバケットにログプレフィックスのファイルが作られていることを確認します。

aws s3 ls s3://${S3_BUCKET_NAME}/${S3_OBJECT_PREFIX}/

ファイルが作成されている場合、コマンド実行後に以下のように出力されます。

2020-09-26 05:18:26       2935 2020-09-26-05-18-25-A44181ED2D12C6DA
2020-09-26 05:18:27       1468 2020-09-26-05-18-26-4CA7D54903B72B4F
2020-09-26 05:18:49        734 2020-09-26-05-18-48-13AABCAA53BD5E8E
2020-09-26 05:18:57       1416 2020-09-26-05-18-56-A8F517B37FCB32B4
2020-09-26 05:19:02       2109 2020-09-26-05-19-01-C7FFC74DA7AEB437
2020-09-26 05:19:08       3550 2020-09-26-05-19-07-02E2F4A93A96D79B
S3バケットの破棄

コンテンツバケットとログバケットを以下のコマンドで削除します。

まずは、s3 rm--recursiveオプションをつけてバケット内のオブジェクトを削除します。コマンド実行後に削除されたオブジェクトが表示されます。

aws s3 rm s3://${S3_BUCKET_NAME} \
 --recursive

s3api list-objects-v2でオブジェクトが存在しないことを確認します。コマンド実行後にエラーが出力されなければOKです。

 aws s3api list-objects-v2 \
--bucket ${S3_BUCKET_NAME} \
--max-items 1000

s3api delete-bucketバケットを削除します。コマンド実行後にエラーが出力されなければOKです。

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

s3api list-bucketsバケットが存在しないことを確認します。コマンド実行後にエラーが出力されなければOKです。

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

ハンズオンは以上です。

LT

今回はLTが2本ありました。

AWS CLIで月160万円の負債を解消した話 大内さん

資料はこちらです。

3日間の新人研修でかかるAWS費用(EIP+EC2+RDS(約2,000円/月))をAWS CLIで解消したというお話でした。800人分の研修用環境を後片付けするのは大変ですし、削除漏れがあると膨大な費用になります。それをAWS CLIでShellを組んで実行するだけで最小限に抑えたことには驚きでした!目に見える結果を技術を駆使して出したことに敬意を抱くばかりでした。

CDKについて 佐藤さん

突発のLTのため資料はありませんでしたが、CDKについてのお話でした。プログラミングでAWSに環境構築できるのは面白そうだと思っていましたが、プログラミングの素養がほとんどなくCDK途中で挫折してしまいました。CLIで理解を深めた上でCDKもいずれ再挑戦してみたいと思います。

最後に

Webサイト公開のように見えやすい結果のあるハンズオンだと、「ハンズオンやり切った!」という実感がとても強いです。今回のハンズオンも楽しみながら参加できて勉強になりました。そういえば、LTのあるCLI専門支部ハンズオンに参加したのは初めてでした。今回の大内さんを聞き、自分が学んだことを組織や顧客のプラスになることに使う、そんな仕事を実現したいと思いました。また、今回のハンズオンを終えて、自分もどこかでLT登壇したいと思いました。今年の初めに技術ネタで登壇したいとブログに書いておきながら、やれずに今年も残り3か月…いいかげん挑戦しようと思います。少しでも良い話ができるよう、気合入れなおして今後のCLI専門支部ハンズオンにも臨みたいです!

【技術書典9】リモートワーカーのためのゆる時間活用&ゆる継続のススメを読んで

技術書典9で購入した「リモートワーカーのためのゆる時間活用&ゆる継続のススメ」の感想を書こうと思います。 私も4月から在宅勤務が始まり早半年。最近慣れてきたせいか、公私ともにダラダラすることが多くなったと感じていたため、改善の参考にしたくて購入しました。

目次

リモートワーカーのためのゆる時間活用&ゆる継続のススメ について

techbookfest.org

感想

購入したのは今日(9/20)でしたが、1日で読了しました。 50ページとちょうどよいページ数と文字数でとても読みやすかったです。 私、本読むのがとても遅くて100ページ未満の本も絶対に数日かかるのですが(マンガは例外)、1日で読めたのは初めてかもしれません。 前半は時間活用について、後半は継続のしかたについて書かれており、どちらも参考になりました。

参考になった点
休日のタスク宣言と日報

休日も「タスク宣言」と「日報」をSNSに発信していることが書かれていました。 私もたまにやりたいことをツイートしますが、それと似てるなぁと思いました。 パブリックな場で発信すると、やれなかったり引っ込めたりするのはカッコ悪いって思っちゃうんですよね。 もちろんやれなかったからと言って誰かに怒られるわけではないですが。

仕事だけでなく、休日にやりたいことを「タスク宣言」と「日報」として発信することで、自分自身に発破をかけるのは良いことだと思いました。 私は休日だと何か緩く過ごしてしまうことが多いのですが、少し無駄に時間を溶かしている感がありました。 これからの休日に取り組みたいことがあるならば、自分もやってみようと思いました!

ちなみに、明日は実家に行くので何もしない(できない)見込みです。 ダメな人の言い訳に聞こえるかもですが、明後日からやります!(マジで!)

継続できない理由を紐解く

私も意を決してやり始めたものの、継続できずに途中でくじけた経験が何度となくあります。 その度に時間を無駄にしたと思ったり、落ち込んだりしたことがあります。 でも、今までその理由とちゃんと向き合ったことはなかったかもしれません。 思い返してみると、

  • 時間を作ることができなかった。
  • 勉強したが難しくて途中で挫折した。
  • 途中で興味を失った。

といったことがほとんどです。時間を作るのは、前半でも書いてあった時間の活用方法を参考にしたり、 緩くても少しずつ続けていくことで解決できるかもしれないと思いました。

他の2つは、時間が過ぎて優先度が低くなった。一度それは置いておいて優先度を高いものを継続していけばよい。 そういうマインドに寄せていけば、継続できて自分の強味につなげていけるかなと思い、心が軽くなりました。

最後に

緩くても時間を上手く使えること、継続できることは素晴らしいことと再認識することができました!もちろんそれを目的にせずに辛かったら休めばよいことも再認識出来て、少しホッとした気持ちに慣れました。続けることを目的にしてしまったら、辛くなるだけですよね。最近そんな節があったので、気づけて良かったです。

このブログは、自分が学んだこと・体験したことをブログにアウトプットして備忘録にしたり、復習するために書き続けてきているので、単にブログを書くこと、本を読むこと等が目的にならないように気をつけないとと思いました。

タイトルに「リモートワーカー」とありますが、在宅勤務していない人でも時間の使い方(特に休日の)や何かに継続することに悩んでいる方にはおススメです!

技術書典9もあと2日。積読にしがちな自分ですが、気になる技術書を買って連休明けも読み進めていきたいと思います。 最後まで読んでいただきありがとうございました!!

【技術書典9】ハラククリカタを読んだ感想

9/12から技術書典9がはじまりましたが、皆さんは何かお気に入りの技術同人誌は見つかりましたか?

今回は私が技術書典9で購入した「ハラククリカタ」について感想を書きたいと思います。 このタイトルを聞いた時に「これは絶対に買おう!」と思いました。 私は、なかなか覚悟できずに一歩前に進むことに時間がかかる性格です。 そんな性格を直すにも時間はかかりますが、これから自分に参考になりそうと思い、技術書典開始前から期待していました。 読了してその期待を裏切ることはありませんでした。

目次

ラククリカタの紹介

「ハラククリカタ」は、Growthfaction 成長と充実を研究する会のメンバーが執筆した技術書です。 Growthfactionのメンバー5人の作品とその5人が推薦した方々のコメント、全162ページで構成されています。

techbookfest.org

Growthfactionはこれまでにも2冊技術書を頒布しています。「挫折論への招待」は読みました。 「セイチョウジャーニー」も読みたいと思います。

techbookfest.org

  • 挫折論への招待

techbookfest.org

感想

162ページもあるため読み応え十分でした。ゆのんさん、てぃーびーさん、KANEさんはご自身の経験を基に腹の括り方を書かれていました。やはり、ご自身の経験を書いた話はリアリティがあり説得力があります。

横山遼さんとVTRyoさんは、ストーリー形式でしたがとてもリアリティのあるお話で、読んでいる途中から胸が熱くなりました。また、読みやすいストーリーでお二人が伝えたいポイントが入りやすかったです。

5人のパート及び推薦者コメントを通して共通しているなと思ったことを集約すると、

  • 自分がやりたいことを見つける。
  • 自分が何者かを知る。
  • 自分の人生を切り開いていくために自分で考えて生きる。
  • 選択したことが正しかったと思えるように生きる。

だと思いました。

ゆのんさんのパートでも書かれていましたが、

『これは私の物語だ』

まずはこう思えるようになることからかなと思いました。 プライベートや仕事上で問題が起こっても、まず「面倒くさいな」とか思ってしまいがちです。 さらにそれを「他人が何とかしてくれればいいのに」と思ってしまうこともあります。 しかし、他人が決めたことに納得感低く従うかりだと、自分が仕事をしたり生きる意義が分からなくなることがあり、 そちらの方が面白くなくてモヤモヤすることがあります。 今生きているのは自分だし、自分で決めてその後の進路も決められた方が楽しいし、責任感も上がると思いました。 これから先自分の人生は続いていくわけですし、「人生」という名の「物語」を作るのは自分自身。 ハッピーエンドになるようにしていかなければならないなと思いました。

もちろんこの考え方を自分に義務として課したり、他人に押し付けたりするのは違うと思います。 しかし、その方が仕事も人生ももっと楽しく生きられるのかもなぁと私は思いました。

そのために、自分のやりたいこと・目指したいところ、自分自身に向き合って決めて行動する。選択したことに責任を取れるように一生懸命生きていきたいと思いました。

私のハラククリカタ

先に少し書きましたが、私は何か問題が起こると真っ先に「面倒くさい」と思ってしまう節があります。 しかし、私がなかなか決断できない、やりたいと思っていることに進められないのは、 成功しなった場合に責任を取る自信がない、取りたくないという逃げの姿勢が残っているからだと気づきました。

  • 失敗して怒られるのでは?
  • 反対されるのでは?
  • 今生活が破綻したら家族に面目がたたない。

など、ネガティブな思考から安全と思われる道の方に行こうとしているのだと思います。 しかし、やりたいことの決断をせずにやりたくないことを我慢して過ごしていたら、 精神衛生上良くないし一生後悔すると思います。それは嫌だ。

まずは自分のやりたいこと・目指したいところを見直し、そこに向かって小さくても一つ一つ決意と決断と実行を繰り返す。 失敗してもダメージが大きくならないよう根拠を持った行動をし、責任を取れるようにする。そんな経験を積み重ねたいと思います。

私のハラククリカタと言えるものはまだありませんが、 小さなハラククリで自信をつけて、大きなハラククリをできるように日々を過ごせればなぁと思います。 自分のハラククリカタと自信を持って言えるものを確立できるように。

最後に

今回の技術書典9も面白そうな技術書がたくさんあるのですが、まだこの「ハラククリカタ」しか購入していません。 私はどうも積読しちゃうので(私だけじゃないと思いますが・・・)、まずはちゃんと読み切ってから次を買おうと思っていました。 一番読みたかった「ハラククリカタ」を読み終えたので、この後いろいろと買います。 印象に残った技術書があったら、また感想ブログを書こうと思います!

最後まで読んでいただきありがとうございました!!