Hejdaの見る夢

一人前のエンジニアを目指して頑張ったこととかをつらつら書くブログ

Microsoft Learn もくもく会に参加しました(※ 注意書き有

注意点

※ 当日はわたしは咳喘息の悪化に伴い、本当は参加していません!!

※ この記事は、行きたかった気持ちを供養する記事です…

Microsoft Learn もくもく会とは

紹介

今回は、第10回 Microsoft Learn もくもく会 @品川 に参加してきたので、その時のメモになります。(※ 参加出来ていません)

雰囲気や内容を把握して頂き、今後参加される際の参考になればと思います。

あと、 Twitter でおだしょーさん(@MS_odasho)を追いかけていると、より詳細な雰囲気が掴めると思います

楽しそうですよね!! :)

当日の時間の流れや雰囲気

ざっくりなスケジュール

  • 12:30 ~
    • 受付
  • 13:10 ~
    • 会の説明
  • 13:15 ~
    • 自己紹介
  • 13:20 ~
    • もくもくタイム開始
  • 16:45 ~
    • 成果発表
  • 17:00
    • 解散

雰囲気

  • (普通の?)もくもく会
  • 飲み物はフリードリンクをいただけるので、適宜動く感じ

あまりツイートが見つからなかったので、みんな集中してやっていたのかなと思います!

アドベントカレンダーについて

話しが変わるのですが、すこし前に Twitter で以下のやりとりがあり、 Microsoft Learn のアドベントカレンダーを作ることになり、勉強会でも紹介がありました。(これは予想)

今回はこのアドベントカレンダー作成と実施も兼ねて参加したので、効率的に時間を使えたかと思います。(※ 参加出来ていません)

なお、勉強会後は有志で夕飯を食べに行ったそうなのですが、私は次の予定があったので、先に帰りました。

次回参加出来る機会があれば、ごはんまでご一緒出来るといいなと思います :D

わたしが作成しているコレクション

まとめとか感想とか

Microsost learn は本当にすごくよく出来たサービスであり、もろもろのサービスの質や量、認定精度、社員さんの対応などを考えると Microsoft の本気というか、ある意味 余裕さ さえ感じました。

本当にエンジニア(も)を大切にしているんだなという印象が他のクラウドよりもより強く感じます。

しかし、 Microsost Learn はキッカケでしかないため、ここで得た知識や技術を使って実際に Azure を動かして、なにかアウトプットをしたいなと思います!! ;)

Azure Citadel のすゝめ 🧐

サマリ

Azure Citadel に感動したのでそれをおすすめする記事です!!

f:id:nari_kyu:20191104143355p:plain

どんなサイトなの??

https://azurecitadel.com/about/

簡単にまとめると以下のようです。意訳なので間違ってたらごめんなさい :(

  • Azure Citadel はイギリスのとあるコミュニティチームに属している、数人の Microsoft クラウドアーキテクト達が共同で立ち上げたコミュニティサイトである。
  • Microsoft の公式なサイトではない。
  • イギリス国内外問わず、 Microsoft (社員) 外の技術的なコントリビューターによるコントリビュート (contributes) が存在している。
  • 記事に前提知識が必要なものも少なくなく、 Azure への基礎的な理解は Microsoft Learn などの公式の Microsoft サイトを参照すること。

また、閲覧のみであれば会員登録も必要無く自由に閲覧することが出来ます。

GitHub Pages でホスティングしているので、ページのソースを見ることも出来ます。

具体的にどんなものがあるの??

2019/11 現在のカテゴリーとその説明は以下の 11 項目

https://azurecitadel.com/categories/

f:id:nari_kyu:20191104143336p:plain

  • Automation
    • Operate at scale and manage your cloud resources optimally through governance and automation. Subscribe to the feed in the footer!
  • Cloud Native
    • Understand how to build cloud native, modern apps with containers, serverless & Kubernetes.
  • Data & AI
    • Real world AI with cognitive services, bots data-analytics and machine learning.
  • DevOps
    • Deploy & build software faster through pipelines, with automation and DevOps practices.
  • Fundamentals
    • Core concepts of Azure and information on getting started for beginners.
  • Infrastructure
    • Virtual machines & networking are still the backbone of many cloud architectures.
  • Internet Of Things
    • Build production-grade IoT applications and configure your IoT solution.
  • Pre-Reqs
    • Get yourself set up and ready to take on the labs.
  • Security
  • Specialised Workloads
    • Specialised topics such as SAP, HPC and other demanding enterprise workloads.
  • Web & Mobile
    • Developing using web & mobile platforms using RESTful APIs. Azure platform services and API management.

感想とか

Microsoft Learn や 公式ドキュメントもありますが、Azure Citadel は(自分の GitHub に誘導することも出来るなどの)エンジニアとしてある程度自由度を持ったコミュニティのように感じました。(もちろん Azure Citadel で完結する記事も多くあると思います。)

そして、記事や閲覧者が増えることによって、コミュニティとしての成長の余地は十分にあるサイトだとも感じました。

将来、このようなコミュニティサイトで多くのエンジニアが自分の価値を表現出来ると期待しています。

いつの日か、自分でも(もちろん英語で)投稿出来るように頑張ります :D

Google 公式ドキュメントにコントリビュートした時のまとめ(Contributor License Agreementの話も)

サマリ

Hacktoberfest 2019 に参加する流れで Google の公式 Repository の 1 個に Pull Request(以下、PR)作ってみようと思いました。

偶然にも修正するべき変更点を見つけることが出来たので、 PR を作り、 Merge されるまでの流れを簡単に記したいと思います。

この流れの中で Contributor License Agreement (以下、 CLA) というものにも出会ったので、記しておきます。

変更点

今回、 PR を出した Repository は GoogleCloudPlatform/nodejs-docs-samples であり、 GCP の公式の Repository になります。

その中で実際に発見し、修正した変更点はとあるディレクトリの中の README の中の リンクが変に切れていた 箇所があったのでそれを修正するものです。

実際の変更点は以下になります

## Run the tests

1. Read and follow the [prerequisites](../../#how-to-run-the-tests).

1. Install dependencies:

        npm install
  • After
## Run the tests

1. Install dependencies:

        npm install

修正自体は簡単なものだったのですが、 PR を作るまでに以下の 2 点を調べます。

  • なぜ、このような(リンク先が無くなる)ことが起きたのか
  • 変更内容が妥当だと思う根拠はなに(どれ)か

これは、 PR を作る際に、根拠として需要になってくるからです。

このリンクが死んだタイミングを調べる

なぜ、このような(リンク先が無くなる)ことが起きたのか変更内容が妥当だと思う根拠はなに(どれ)か についてはだいたい調べは終わりました。

同じようにリンクが出来なくなっている箇所が他に無いか確認する

ここまでで修正する根拠は見つけられましたが、他にも同じような箇所が無いか確認しておきます。

  • 流れ
    1. ブラウザ上で人力で探すのは厳しかったので、 Repository をローカルに clone した後に grep コマンドで探しました。
    2. 結果的には無かったので、変更点は 1 ファイルのみということが分かりました。

PR を作る

順番としては以下のようにやりました

  1. オリジナルの Repository (GoogleCloudPlatform/nodejs-docs-samples)を自分のところに Fork する(iganari/nodejs-docs-samples)。
  2. Fork した Repository にて feature ブランチを作り、そこで修正する。
  3. オリジナルの Repository に対して PR を作成する。

PR 作成まで、問題無く進みました!

Contributor License Agreement (CLA) に署名する必要がある

PR 作成直後

PR を作ったすぐ後は、以下のようになります。

f:id:nari_kyu:20191104060937p:plain f:id:nari_kyu:20191104060956p:plain

これは Google Open Source Project に指定されている Repository に コミットする場合(正確には commit した時のメールアドレスを確認している)に、署名が必ず必要だからです。

内容的にはソフトウェアに対しての権利関係の同意書になります。

詳しくは下記を参照して下さい。

CLA に署名していく

googlebot から促されたリンクをクリックし、 CLA に署名をする流れです。

f:id:nari_kyu:20191104061105p:plain

  • 実際にコントリビュートする際に、またその後に関しても重要なので、ちゃんと目を通しましょう。

f:id:nari_kyu:20191104061122p:plain

  • 同意であれば、必要事項記入に進みます。

f:id:nari_kyu:20191104061147p:plain

  • 必要な項目を埋めましょう。

f:id:nari_kyu:20191104061205p:plain

  • 正常に記入が完了すれば、以下のようになります。

f:id:nari_kyu:20191104061216p:plain

googlebot に伝える

  • PR の中にコメントがあるように、 googlebot に対して CLA にサインした旨を伝えます。

f:id:nari_kyu:20191104061227p:plain

その後はレビュアーが確認するフェーズになりますので、こちらは待ちのステータスになります。

残タスク

残タスクとしてレビュアーが確認した際に、過不足や的はずれな修正内容だと、指摘が入るかもしれません。

定期的に確認したほうがいいかと思います。

結果と感想

PR 作成から 3 日後にレビュアーの確認が始まり、次の日には Merge されていました。

幸いにも指摘のやりとりが発生するような大きな修正では無かったし、ちゃんと根拠も記載したのが良かったのかもしれません。

今回の経験で、公式ドキュメントでもちゃんとやり方を守れば、自分でも修正出来るという経験を得られたのは大きかったと思います。

これからもいろんなことに臆せず挑戦していこうと思います!!

Azure Storage を Terraform で構築するサンプルを公開しました!! 🎉🎉🎉

動悸

Serverlessdays Tokyo 2019 にて素敵な登壇があり、実際に書いてみようと思いました。

  • Azure でサーバーレス、 Infrastructure as Code どうしてますか? by @dz_
    • Have fun! 💖

www.slideshare.net

Terraform は普段から書いているし、ちょうど Google Cloud Storage をいじっていたので、 同じストレージ系だからそこまで時間かけずにいけるだろうと思い、 Azure Storage の中の Azure Blob を調べるとこからはじめました。

調査と実際に簡単な検証、コードを公開出来るようにまとめるまでに 8 時間くらいかかりました。

Azure に慣れていないので、 Terraform において Azure にログインするとこで一回心が折れましたが、なんとかミニマムで公開出来るくらいにはまとまりました。

サンプルコード

以下の Repository が実際に作成したサンプルコードです。

github.com

実際にやってみる

Azure のアカウントの作成

ここは他に記事におまかせします。

Docker のインストール

実行環境を Dockerfile で用意しています。

したがって、作業マシンに Docker Engine をインストールしてください。

参考: Install Docker

Repository の取得

今回は自作した Repository を使って、挙動を確認していきます。

  • Repository を clone します。
cd {YOUR_WORKSPACE}
git clone https://github.com/iganari/package-azure.git
cd storage/terraform/
$ tree
.
├── Dockerfile
├── README.ja.md
├── README.md
├── docker-build-run.sh
├── images
│   └── irasutoya
│       ├── azarashi
│       │   ├── animal_chara_computer_azarashi.png
│       │   ├── animal_chara_smartphone_azarashi.png
│       │   └── animal_gomafu_azarashi_baby.png
│       ├── hiyoko
│       │   ├── animal_mark_hiyoko.png
│       │   ├── hiyoko.png
│       │   ├── hiyoko_baby.png
│       │   └── niwatori_hiyoko_koushin.png
│       └── penguin
│           ├── animal_chara_computer_penguin.png
│           ├── animal_chara_smartphone_penguin.png
│           ├── natsubate_penguin.png
│           └── ondanka_animal_penguin.png
├── provider.tf
├── resource_group.tf
├── storage.tf
├── terraform.tf
└── variables.tf

5 directories, 20 files

Terraform の設定ファイルの説明を簡単に示します。

  • terraform.tf
    • Terraform のバージョンを固定します。
    • Terraform はバージョンが上がるのが早いので可能な限り、固定したほうがいいでしょう。
terraform {
  required_version = "0.12.12"
}
resource "azurerm_resource_group" "arg_default" {
  name     = "${lookup(var.common, "rsg_name")}"
  location = "${lookup(var.common, "rsg_location")}"
}
resource "random_string" "asa-suffix" {
  length  = "8"
  upper   = false
  lower   = true
  number  = false
  special = false
}

resource "azurerm_storage_account" "asa_default" {
  name                     = "${lookup(var.storage, "asa_name")}${random_string.asa-suffix.id}"
  resource_group_name      = "${azurerm_resource_group.arg_default.name}"
  location                 = "${lookup(var.common, "rsg_location")}"
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

resource "azurerm_storage_container" "asc_default" {
  name                  = "${lookup(var.storage, "asc_name")}"
  resource_group_name   = "${azurerm_resource_group.arg_default.name}"
  storage_account_name  = "${azurerm_storage_account.asa_default.name}"
  container_access_type = "private"
}

resource "azurerm_storage_blob" "asb_default_01" {
  name                   = "penguin_01.png"
  resource_group_name    = "${azurerm_resource_group.arg_default.name}"
  storage_account_name   = "${azurerm_storage_account.asa_default.name}"
  storage_container_name = "${azurerm_storage_container.asc_default.name}"
  type                   = "Block"
  source                 = "images/irasutoya/penguin/animal_chara_computer_penguin.png"
}
resource "azurerm_storage_blob" "asb_default_02" {
  name                   = "sample/penguin_02.png"
  resource_group_name    = "${azurerm_resource_group.arg_default.name}"
  storage_account_name   = "${azurerm_storage_account.asa_default.name}"
  storage_container_name = "${azurerm_storage_container.asc_default.name}"
  type                   = "Block"
  source                 = "images/irasutoya/penguin/animal_chara_smartphone_penguin.png"
}

resource "azurerm_storage_blob" "asb_default_03" {
  count = "${length(var.image-hiyoko)}"

  # same version
  name = "sample03/hiyoko/${element(var.image-hiyoko, count.index)}"
  # # rename version
  # name = "sample03/hiyoco-${lookup(var.image-hiyoko, count.index)}"

  resource_group_name    = "${azurerm_resource_group.arg_default.name}"
  storage_account_name   = "${azurerm_storage_account.asa_default.name}"
  storage_container_name = "${azurerm_storage_container.asc_default.name}"
  type                   = "Block"
  source                 = "images/irasutoya/hiyoko/${element(var.image-hiyoko, count.index)}"
}
  • variables.tf
    • 変数をまとめておく設定ファイルです。
variable "common" {
  type = "map"
  default = {
    rsg_name     = "rsg-sample"
    rsg_location = "West Europe"
  }
}

variable "storage" {
  type = "map"
  default = {
    asa_name = "asasample"  # name can only consist of lowercase letters and numbers, and must be between 3 and 24 characters long.
    asc_name = "asc-sample"  # Only lowercase alphanumeric characters and hyphens allowed.
  }
}

variable "image-hiyoko" {
  default = [
    "animal_mark_hiyoko.png",
    "hiyoko_baby.png",
    "hiyoko.png",
    "niwatori_hiyoko_koushin.png"
  ]
}

以上が Terraform の設定ファイルになります。

また、 Dockerfile を用いた環境を構築するために、以下のようのなシェルスクリプトも用意しました。

  • docker-build-run.sh
#!/bin/bash

set -xeu

_I_TAG='pkg-azure-storage-tf'
BASEPATH=$(cd `dirname $0`; pwd)
DIREPATH=`echo $BASEPATH | awk -F\/ '{print $NF}'`

set +eu
docker rm -f ${_I_TAG}
set -eu

docker build . -t ${_I_TAG}

docker run --rm \
           -it \
           -v $BASEPATH:/opt/iganari/$DIREPATH \
           -w /opt/iganari/$DIREPATH \
           -h ${_I_TAG} \
           --name ${_I_TAG} \
           ${_I_TAG} \
           /bin/sh

上記のファイルを用意したら、実行していきます。

Docker コンテナを用いて、 Terraform を実行する

  • Docker コンテナの起動をします。
    • 以降、 🐳 がついているものはこの Docker コンテナ上で実行しているものとします。
sh docker-build-run.sh
  • 🐳 az コマンドのバージョンの確認します。
    • 執筆当時は 2 系を使用していますが、読むタイミングによってはバージョンがもっと進んでいる可能性があります。
# az --version
azure-cli (2.0.57)
  • 🐳 Terraform のバージョンを確認します。
    • 執筆当時は 0.12.12 系を使用していますが、読むタイミングによってはバージョンがもっと進んでいる可能性があります。
    • しかし、今回の環境においては terraform.tf で Terraform のバージョンを指定しているため、このバージョンでしか実行出来ないようになっています。
    • Dockerfile にもこのバージョンを指定してインストールしているため、このバージョンが使用出来ない場合はそもそも Docker コンテナが起動しない可能性があります。
# terraform --version
Terraform v0.12.12
  • 🐳 az コマンドを持ちいて、 Azure にログインします。
az login
### 例

# az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code {ここに認証用のコードが出力されています} to 

f:id:nari_kyu:20191028050452p:plain

### ブラウザでの認証が完了する以下のように、現在使用出来るサブスクリプションが表示されます。

authenticate.
[
  {
    "cloudName": "AzureCloud",
    "id": "xxxxxxxxxxxxxxxxxxxxx",
    "isDefault": false,
    "name": "xxxxxxxxxxxxxxxxxxxxx",
    "state": "Warned",
    "tenantId": "xxxxxxxxxxxxxxxxxxxxx",
    "user": {
      "name": "xxxxxxxxxxxxxxxxxxxxx",
      "type": "user"
    }
  },
  {
    "cloudName": "AzureCloud",
    "id": "xxxxxxxxxxxxxxxxxxxxx",
    "isDefault": true,
    "name": "xxxxxxxxxxxxxxxxxxxxx",
    "state": "Enabled",
    "tenantId": "xxxxxxxxxxxxxxxxxxxxx",
    "user": {
      "name": "xxxxxxxxxxxxxxxxxxxxx",
      "type": "user"
    }
  },
.
.
.
以下、割愛
  • 🐳 現在のデフォルトのサブスクリプションを確認します。
    • 環境によっては、複数出てくるかもしれませんが、重要なのは IsDefault のカラムが Trure になっているものです。
az account
OR
az account list -o table
### 例

# az account list -o table
A few accounts are skipped as they don't have 'Enabled' state. Use '--all' to display them.
Name                        CloudName    SubscriptionId                        State    IsDefault
--------------------------  -----------  ------------------------------------  -------  -----------
iganari-dev                 AzureCloud   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  Enabled  True
_s_id='{上記でSubscriptionIdの項のもの}'
az account set --subscription ${_s_id}
### 確認のため
az account list -o table
  • 🐳 Terraform の初期設定を行います。
    • 実際に Terraform を実行するために必要なプラグイン等をダウンロードします。
    • 今回は random と azurerm のプラグインが必要になります。
terraform init
### 例

# terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "random" (hashicorp/random) 2.2.1...
- Downloading plugin for provider "azurerm" (hashicorp/azurerm) 1.35.0...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.azurerm: version = "~> 1.35"
* provider.random: version = "~> 2.2"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
  • 🐳 Terraform にてテストを実行します。
    • 新規作成の場合は特に問題は出ないかと思いますが、もし問題があれば修正しましょう。
terraform plan
# terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # azurerm_resource_group.arg_default will be created
  + resource "azurerm_resource_group" "arg_default" {
      + id       = (known after apply)
      + location = "westeurope"
      + name     = "rsg-sample"
      + tags     = (known after apply)
    }
.
.
.
割愛
.
.
.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
  • 🐳 テストが無事に通ったら、実際にリソースを作るコマンドを実行します。
terraform apply
### 例
# terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # azurerm_resource_group.arg_default will be created
  + resource "azurerm_resource_group" "arg_default" {
      + id       = (known after apply)
      + location = "westeurope"
      + name     = "rsg-sample"
      + tags     = (known after apply)
    }

.
.
.
割愛
.
.
.


Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:

********************************************
*** 上記のように、確認を求めらるので、 yes とします。
*** 下記が yes と入力した後の出力です。
********************************************

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

random_string.asa-suffix: Creating...
random_string.asa-suffix: Creation complete after 0s [id=sxvygxvo]

.
.
.
割愛
.
.
.

azurerm_storage_blob.asb_default_03[0]: Creation complete after 8s [id=https://asasamplesxvygxvo.blob.core.windows.net/asc-sample/sample03/hiyoko/animal_mark_hiyoko.png]

Apply complete! Resources: 10 added, 0 changed, 0 destroyed.

**********************************************************
*** 上記のように出たら、実行完了なので、ブラウザで確認してみましょう。
**********************************************************

ブラウザでリソースを確認します。

  • ストレージ アカウント にて asasample から始まるリソースをクリックします。
    • asasample より後ろは乱数を生成しています。

f:id:nari_kyu:20191028050715p:plain

f:id:nari_kyu:20191028050730p:plain

  • コンテナーをクリックし、asc-sample をクリックします。

f:id:nari_kyu:20191028050803p:plain

f:id:nari_kyu:20191028050813p:plain

  • 試しに penguin_01.png をクッリクし、ダウンロードをしてみます。

f:id:nari_kyu:20191028051013p:plain

f:id:nari_kyu:20191028051027p:plain

  • 問題無くダウンロード出来れば、いらすとやさんからお借りしたペンギンの画像がダウンロードされます。
    • せっかくなので、他の画像もダウンロードしてみてくださいね!

f:id:nari_kyu:20191028051041p:plain

リソースの削除

  • 検証が終わったら、 Azure のリソースは削除しましょう。

    • Azure Storage はアカウント作成後 12ヶ月を過ぎると無料枠が無くなり、通常の課金が発生します。
  • 🐳 Terraform にてリソース削除をします。

terraform destroy

まとめとか感想とか

Terraform を通じて、 Azure のリソースの IaC(Infrastructure as Code) をすこしだけ触れられたかと思います。

難しく無いと言えば難しくないのですが、慣れないとかなり手こずる箇所もあるかと思いますので、サンプルを作ってみましたが如何でしたでしょうか??

動かなかったり、脆弱性があった場合はぜひ Issues にて教えて頂けると幸いです(-人-) ---> issues

ソースには細かい Tips も結構いれてあるのですが、細部まで説明出来なかったので、また他の記事で書きたいと思います。

Have fun! 💖