新入社員活動記録Part.3(山本)

こんにちは。21年度入社の山本です。
今回からは、外部研修から戻って社内での業務について書いていきたいと思います。

はじめての業務

2ヶ月の外部研修を終えて久々の出勤です。いなかった間に模様替えが行われて社内は以前とは違った雰囲気に。
この日からOJTの形式で実際の案件に携わりながら業務の勉強をしていきます。
同期はどうやら、引き続きSQLやPHPの基礎的な勉強をする様子。いきなり同期と別のことをやるということに不安になりますが、先輩方が丁寧に教えてくださるので不安はすぐになくなりました。コロナ禍ということもあり、弊社は完全テレワークです。業務に必要な情報やツールの導入を行い、翌日からは自宅で業務を行います。テレワークだとわからないことや困ったことがあったらといったところが不安になりますが、通話や画面共有を駆使して相談し解決します。便利な時代ですね!

いろんな知識を蓄えたい

弊社では週に一度、業務中に起こった問題やITニュース、社内連絡について共有する場が設けられています。ITの業界では日々新しい技術や試みが行われています。そういったことを教えてもらうことで知識が身につき、また自分でも知れるようにアンテナを張るという意識が芽生えてきます。
中には、こういったことも…
「WordPressのバージョンが古いから更新しないといけないです。」
WordPressはサイトやブログの作成ができるコンテンツ管理システムです。このブログを作っているのがまさにWordPress。こちらのバージョンアップをやらないといけないということですね。
これは大チャンス!WordPressは個人で扱うには少々ハードルが高い…。是非やりたい!ということで無事更新担当の座をゲットしました!(といっても今回限りですが…)
更新担当とは言っても自分だけでやるわけではありません。誤って今までのブログデータ削除なんて起こってしまったら目も当てられないです。先輩にみてもらいつつ作業を行います。

というわけで、次回はWordPressの更新について書いていきたいと思います!
最後までご覧いただきありがとうございました!

新入社員活動記録Part.2(山本)

こんにちは。21年度入社の山本です。
前回に引き続き、外部研修での内容をご紹介します。

残る項目はこちら

  • MySQL
  • PHP入門
  • Laravel
  • Git入門

-MySQL-

これまでの研修はあくまでもPCの基礎的なところといった感じでしたが、ここからはいよいよ実務的な研修です!
SQLは、データベース(以下DB)を制御するための言語で、MySQLはDB管理システムです。
リンゴ:100円、ミカン:50円
みたいなことを登録・管理するシステムということですね!

DBで管理するのは商品の情報に限りません。ユーザーのIDやパスワードなどの個人情報も管理します。
データが吹き飛んだら一大事。そんなことが起こらないような操作方法や、万が一が起きた場合の復旧方法など、大切なことを学ばせていただきました!

研修とはいえ、データは自分で入力したもの。吹き飛んだらショックです。慎重に作業します。

-PHP入門-

DBの操作方法がわかったら、今度はDBとwebページの連携です。PHPという言語の勉強をします。
PHPとは端的に言ってしまえばwebページを作るための言語です。「HTMLは?」となるかもしれませんね。webページはHTMLで書かれていますが、1ページ、1ページ書いていては大変ですよね。PHPでは多言語との連携などHTMLでは難しいことを簡単に行うことができ、完成品はHTMLで表示される(これが大事)という特徴があります。

やってみるとHTML記述が使えるので意外と使いやすい印象です。PHP独自の書き方をするところは、記述方法がはっきりと分かれているので調べるのも簡単です。
ただしDBとの連携はとても難しい!これを覚えるのには苦労しそうです。

-Laravel-

PHPのDBとの連携は難しすぎて匙を投げかけたところに、Laravelが登場です。LaravelはPHPでの開発にあたって煩わしいところを事前に用意しておいてくれているとてもやさしいシステムです。Laravelのようなものはいくつかあり、これらをフレームワークと呼ぶそうです。HTMLの汎用性を高くしたPHPを使いやすくしたLaravel。優しい世界です。
実際のお仕事でもフレームワークを利用しています。それくらい助かっているということが伝わるかと思います!

使用感は・・・革命的ですね!煩わしいところがすべてなくなって非常に使いやすい!なくなってしまったら路頭に迷います。
あえて難しいところを挙げるとするなら、「型にはまらないことをしようとすると大変な作業になる」といったところですかね。可能な限りは用意されている範囲で終えたいものです。

-Git入門-

最後に教えていただいたのはGitです。これは作り方や操作方法というよりは、開発の仕方に近いイメージでしょうか。
お仕事では大抵、複数人で開発を行いますが、みんなで1つのPCをというわけにはいきません。そこでデータを共有して作業を分担するわけですが、手違いで「開発データが壊れた!」とか「〇〇さんのやつ消しちゃった!」など事故が起こらないようにするために、「Gitで開発環境を整えましょうね。」といった内容です。

試してみると、とても簡単でとても便利です。ただし、不思議に思えるところがいくつか出てきます。調べると小難しいことがたくさん出てくるので「便利なツールだなぁ」程度にとどめておきました(笑)。

-最終課題-

研修の集大成として、最後の2週間は1からwebサイトの構築を行いました。実際の現場を意識したグループでの活動。これまで学んだ知識を活かし、みんなで完成を目指します。

僕のグループでは、「旅館・ホテルの予約システム」を作ることにしました。
ありがたいことにリーダーに推薦していただいたので、僕が打ち出したグループ目標は「ほかのグループより多めに休憩を取ろう」です(笑)。休みたいというのももちろんですが、グループでの開発にはコミュニケーションが一番大事!作業じゃないところで打ち解ければ作業の相談も気軽にできます(建前じゃないですよ(笑))。
1から作るので、サイトの構造やDBに入力する情報、もちろんサイトのデザインも必要になってきます。プログラミング作業に入る前の構想だけで10時間ほどかかりました。後々手直しする分も含めればもっと時間がかかっています。プログラミングじゃない作業も大変なんですね。
プログラミングが始まるとわからないことだらけ・・・。けれど期間は決まっている・・・。メンバー内で何度も相談会が行われます。どうしてもわからなければ最終手段、講師の先生に頼ります。何をしたいのか伝えるのも難しい状況で、しっかり意図をくみ取って説明していただけました。

苦労に苦労を重ねて2週間、何もないところから「旅館・ホテルの予約システム」完成です!名前も付けました「やどかり」です!4月の自分からは想像ができない完成度です!着実に実力がついていることを実感します!
最終日は発表会。ほかのグループの作品からも学ぶことはたくさんあります。「このデザインいいなぁ」とか「そうすればスムーズに作業できたのか」とかとか・・・。

-外部研修を終えて-

2ヶ月に及ぶ外部研修もあっという間でした。たった2回の記事では書ききれないことばかりで、ほとんどが感想ばかりになってしまいました(汗)。
確かに言えることは、知らないことを学べて楽しい2ヶ月だったこと、お仕事に活かせる情報や技術がしっかり身についたことです!
来年度入社の後輩たちにも行ってもらいたいなと思える研修でした!

さて、外部研修での出来事は今回でおしまいです。次回Part.3からは会社での出来事・学んだことをお伝えしたいと思います!図や画像もふんだんに使った読み応えのある記事を目指します!ご期待ください!

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

鹿倉の新入社員活動記録・第1回

■読者の皆様へ

初めまして!!  システム開発研究室の鹿倉 圭斗と申します。タイトルから、お察しの通りの社会人、ピカピカ1年目の見習いプログラマーです。この活動記録は、ITに興味がある学生に向けに投稿していきます。

さて、皆様はこんな疑問をもっているでしょうか?

  • ITに興味があるけど、実際に入社後、どの様に働いているのか。
  • PG(プログラマー)の研修内容はキツイのか。
  • 研修後、どの様な動きをしているのか。
  • 研修の雰囲気はどのような様子なのか。

疑問に思っている方は多いと考えています。去年、就職活動していた私も、入社後の働くイメージがありませんでした。そこで、活動記録を定期的に更新する事で、入社後のイメージを持つ事が出来ます

今回、記念すべき、第1回目は、4月末までの外部研修の様子をお伝えします。

※研修内容は企業によって異なるので、参考程度でお考えください。

■外部研修に参加しました。

★外部研修の1日のスケジュールと研修の様子

 自宅から1時間掛けて研修会場である、銀座✨に到着しました。(朝6時起きで少し眠くて電車の中で寝てしまいました。・・・)

時間内容
9:00~9:15連絡事項,3分間スピーチ
9:15~9:45前回の座学の復習
9:45~12:00座学
12:00~13:00昼休憩
13:00~17:00座学
17:00~18:00日報の作成
研修の1日のスケジュール

1日のスケジュールは、左側の通りになっています。

研修は2か月間、月曜日から金曜日までの9時から18時の8時間の研修です。

1時間ごとに10分間の休憩があります。(ちなみに皆さん、休憩中は疲労回復のため仮眠を取った人も居れば、会話もしている人もいました。)

研修の雰囲気は和やかな様子で、よく世間で噂をするブラック研修ではありません。

(真剣に研修を受ける研修環境で、本当にホッとしています。😌)

★研修内容

研修の内容は、以下の項目通りです。

  • 4月では、ITの基礎、Linux,プログラミング入門(HTML・CSS、Java Script ,My SQL,PHP)を学習しました。
  • 朝の業務連絡後には、ローテーションでIT業界の最新のニュース、トレンドを3分間スピーチを行いました。
  • 昼休憩後は、毎週、月曜日・水曜日・金曜日は、作業効率を図るため、寿司打を用いてタイピングを練習をしました。<^!^>(寿司打のレベルは、標準の5000円レベルの難易度で打ちました。)
  • 昼休憩後の火曜日と木曜日は、毎回講師から課される、テーマをグループディスカッションして発表する事を行いました。※テーマは様々です。ex(東京のお土産で選ぶなら何か。、幸せとは何か。等)

 研修のスピードは、とても早く、テキスト1冊が1日で終わる内容もありました。研修のスピードの速さがまるで、新幹線の様なスピードの速さで、研修から2週間後には、頭がパンクしている状態でした。(*_*)

 それでも、研修のスピードについていく様に対策を実行しました。

★研修以外での取り組み

  • テキストの内容で疑問や矛盾を持った事は質問しました。
  • 自宅で学習した事を実践してみました。

 以上の2点を取り組みをする事で、徐々にプログラミングを理解することが出来ました。特に、テキストの内容を質問を積極的に行いました。( `ー´)ノ

研修のスピードが早い為、分からない点もありました。しかし、分からないままにすると、後に他の言語の学習でも影響するので質問しました。

★お役立ち情報

 学生の皆様、IT業界問わず、社会人1年目は、積極的に質問した方が良いでしょう。質問する事で、分からない点も分かるようになり、また、指摘されても、自分では気付かなかった間違いや修正する点を発見する事ができます。

大学や専門学校で先生や教授に質問していない方は、今のうちに質問をする習慣を付けていくと良い事がありますよ。

■まとめ

今回、4月の研修をお伝えしました。 研修を振り返って見て、雰囲気は、プログラミングを実行する時に、講師が徘徊して、質問出来る環境だったので有意義な研修を過ごすことが出来ました。また、初学者でも分かりやすい図や説明をしているので、未経験な私でも、付いて行く事が出来ました。(講師の方に、本当に感謝しています。((+_+)))

しかし、一人前のエンジニアになるには、プログラミングを実行して終わりではなく、もっと効率良くできるのではないかという探究する事も必要だと感じました。好奇心旺盛な方は、もしかしたらプログラマーの職に適しているのではないかと考えています。

次回の第2回目は、5月の外部研修の内容をお伝えします。それでは、IT業界に興味がある学生の皆様、またお会いしましょう。

そして、就職活動中の学生の皆様、頑張ってください。 アディオス!!

新入社員活動記録Part.1(山本)

こんにちは。21年度入社の山本です。
入社から約3か月、今日までにいろいろな経験や学びがありました。
そこで今回から数回に分けて、私が行ったこと、その中から得た学びを連載形式でご紹介します。

自己紹介-

改めまして、こんにちは。21年度入社の山本です。
入社後の研修や学びをご紹介する前に簡単に、自己紹介をします。

私は、某工学系大学の情報学部でコンピュータについて勉強していました。
ハードというよりはソフト側です。
大学ではプログラミングはもちろん、ネットワーク関係、スーパーコンピュータを使った計算を勉強しました。
卒業研究では、「日本の官庁で最初に導入されたコンピュータ」について調べていました。
ちょっと歴史系っぽいですよね・・・。研究室でも異端な研究だったかもしれません・・・。

趣味はパソコンでゲーム。特にFPSが好きです。歴は長め。

そんなパソコン大好きな私ですが、Web系は未経験・・・。どんな苦難が待ち受けているのか・・・!?

外部研修へ

今年度からの新しい試みとして、入社から2か月は外部研修へ行きました。
「新入社員PHP研修」と銘打たれた外部研修では、お仕事の基礎となるプログラミングを学びます。
PHPとは書かれていますが、「そもそもPHPとはなんぞや?」となるわけです(プログラミング言語だということは知ってるけれど・・・)。
そんな私も安心。基礎の基礎から丁寧に学んでいきます。
周りの参加者の皆さんも未経験(新入社員研修だから当たり前ですね・・・)。
みんなで一人前のプログラマを目指すと思うと熱が入ります。

-研修の内容-

研修では、基礎の基礎から始まり、最後にはWebページを作れるようになるまで丁寧に教えていただきました。

新入社員PHP研修では、下記の項目を教えていただけます。

  • IT基礎
  • プログラミング入門
  • PHP入門
  • MySQL
  • Laravel
  • Linux入門
  • Git入門

IT基礎-

プログラミングを学ぶ前に、まずはWebの基礎から学びました。
IPアドレス・MACアドレス・TCP/IP・etc・・・。
この辺は大学でやったから簡単・・・かと思いきや意外と覚えていないものですね。
教科書はメモでびっしり。勉強になります!

-プログラミング入門

いよいよ、プログラミング!
手始めにHTMLを勉強します。
「HTMLはプログラミング言語ではない」なんて声もよく聞きますが・・・。細かいことは置いておきましょう。

HTMLはwebページを作るための言語。私たちがよく知るあのサイトやこのサイトもHTMLで書かれているんです!

作業を重ねるとだんだんwebページっぽくなっていきます。ワクワクしますね!

-Linux入門

HTMLの使い方を一通り教わると、Linux入門に入っていきます。
Linuxとは、WindowsやMacOSに数えられるOSのひとつです。ただし、WindowsやMacOSとは違い、様々なカスタマイズがあるので、どのLinuxを経験したかで操作が全然違います。

今回は、黒い画面にコマンドを打ち込んで操作する所謂CUI操作を学びました!
映画とかに出てくる小難しそうなアレですね!気分はスーパープログラマー!
映画での印象の通り、実際小難しいです!でも大丈夫!やり方は教科書に書いてあります!

このあたりのことをイメージだけでもつかめるようになると、お仕事が少し楽になりますね。実際、業務上で非常に助かっています!

外部研修でのことは一旦ここまで。Part.2へ続きます!

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

COCOAについて

こんにちは。
今回は新型コロナウィルス接触感染アプリCOCOAについて調べました。

COCOAとは?

日本の厚生労働省が提供するスマートフォン向けCOVID-19アプリである。
略称はCOCOA。
濃厚接触の疑いのある本アプリ利用者間の接触をBluetoothによって検知・記録し、接触者から新型コロナウイルスの陽性者が発生したときに、その旨を通知する。アプリの通知を受けた利用者は、自主的な隔離生活や、医療機関への受診を各自で検討できるようになる。

仕組みについて

COCOAは、接触を確認する仕組みとしてBLE(BluetoothLow Energy)を使います。COCOAはBLEを使って定期的に近くのデバイスに信号を送り、信号の強さからお互いの距離を推測します。この距離を推測する機能はBLEの一部として既に実装されています。そして、1m以内に15分以上接近したデバイスとID(接触符号)を交換します。接触符号は、1日に一度ランダムに生成される日次鍵から(ハッシュ関数を用いて)生成されます。

※BLEについて
近距離無線通信技術Bluetoothの拡張仕様の一つで、極低電力で通信が可能なもの。
2010年7月に発表されたBluetooth 4.0規格の一部として策定されたものです。

調べて思った事

様々な記事を見たのですが接触通知があったからといって検査が受けられる訳ではないようです…地域、県によっては受けられる所もあるようです。
濃厚接触していたとしても症状が出ないと受けられないようです。
この事についてはなんで受けられないのだろうと考えたのですが症状が出てからではないと陽性と反応されないのではと考えました。

使用感について

個人的に思った事は、不具合は多いが入れていて損のないアプリだと思います。
アプリ入れてる人はまだあまり多くはないと思うが医療機関やイベント会場など様々なところで呼びかける事により沢山の人に使用されていくアプリになるのではないかと思います。

今回は、この辺で失礼いたします。
最後まで閲覧いただきありがとうございます。

iOS14について

こんにちは。白瀬です。
 つい先日、米国時間9月16日にリリースされたios14についてまとめてみました。

<対応機種について>

  • iPhone 6s ~ iPhone 11(Pro,ProMax,Plusを含む)
  • iPhone SE(1世代,2世代)
  • iPod touch(7世代)

<新機能について>

  • ウィジェット

 今まで一番左側にあったウィジェットをAndroidのようにホーム画面の好きな位置に置けるようになりました。また、時間帯によって自動で切り替わるウィジェットもホーム画面に置くことが可能になりました。

  • Appライブラリ

ホーム画面の最後のページにダウンロードした全てのアプリが表示するAppライブラリの追加。

 目的のアプリをシンプルな操作で探しやすいようにiOSが自動でカテゴライズしてフォルダに収納されます。フォルダ内のアプリでも、よく利用するアプリはワンタップで起動可能。アルファベット順および50音順に並べたリストから探したり、検索ワードで探すことも可能です。
 また、ホーム画面の特定ページを非表示にすることも可能になりました。

  • ピクチャ・イン・ピクチャ

 ビデオ通話のFaceTimeや動画を見ながら他のアプリを操作可能になりました。

  • 翻訳アプリ

 日本語を含む11言語のテキスト入力と音声入力に対応。iPhoneを横に向けると会話モードに移行し、言語を自動検出して会話内容をリアルタイムに翻訳し、オンライン機能も備えているため、ネット環境がない場所や重要な会話でもiPhoneで翻訳可能になりました。

  • CarKey

iPhoneとAppleWatchが車の鍵になる新機能。iPhoneをドアノブに近づけるだけでロックを解除できます。そのまま車のリーダーかワイヤレス充電器に乗せるだけでエンジンもかけられるため、自宅に車の鍵を忘れても安心。

鍵はiMessageを使って友だちや家族とも共有できるため、車の鍵を直接会って渡さなくても運転できます。紛失した場合はiCloud経由で鍵を無効にすることも。iPhoneのバッテリーが切れたあとも最大5時間動作します。
まずは今年中にNFCを使ったCar Keyの提供がスタート。はじめに来月発売(現在2020年9月)のBMW5シリーズが対応します。来年にはU1チップを搭載したiPhoneでポケットやカバンから取り出さずにロックを解除できるようになります。

  • AirPods

新機能「自動切り替え」では、利用しているデバイスに合わせて接続先が自動で切り替わります。例えばiPhoneで通話を終えてMacでテレビ会議に参加するとiPhoneからMacに自動で接続先が切り替わり、Macでテレビ会議を終えてiPadで映画を見ると自動でMacからiPadに接続先が変わります。

最大のアップデートは、上下左右前後から音を飛ばして臨場感のあるサウンドを実現する「空間オーディオ」と「ダイナミックヘッドトラッキング」の追加です。

声や音が飛んでくる方向に横に向けると、通常は音の出力位置も変わるため何も変わりませんが、ダイナミックヘッドトラッキングでは顔を横に向けると音が自分に向かって飛んでくるため、リアルなサウンドを楽しめるようになります。

※この機能は『AirPods Pro』のみ利用可能。

ダイナミックヘッドトラッキングについては説明がとても難しいため是非、ご自身で体験してみてください。

そのほかに追加された機能もありますので気になった方はぜひ、チェックしてみてくださいね。

今回は、この辺で。
最後まで閲覧いただきありがとうございます。

AWS Lambdaを使った外形監視

福岡拠点の野田です。
AWSを使ったサーバー構築が最近増えてきました。今回は、AWS Lambdaを使った外形監視の方法を紹介しようと思います。

AWS Lambdaは、軽量なアプリケーションを動作するときに活躍するサービスです。5分おきのバッチサービス、管理画面でのSSRサービスなど、 常に常駐しておく必要がないプログラムを動かすのに適しています。 今回紹介する監視系のバッチもLambdaと相性のよいアプリケーションの1つとして考えています。

AWS Lambdaを使った外形監視の作成を以下の手順ですすめていきます。

  1. 関数の作成
  2. 関数コードの作成
  3. トリガーの追加

関数の作成

「1から作成」を選択します。関数名は「check_http」のような名前を付けます。ランタイムは、javascriptサーバーの「node.js12.x」を選択して関数を作成します。

アクセス権限については、「基本的な Lambda アクセス権限で新しいロールを作成」を選ぶとAmazon CloudWatch Logsの権限が付与されるので、これを選びます。

関数コードの作成

index.jsに以下をコピペします。

[/crayon]

ページ末尾の環境変数に以下のような監視対象URLを指定します。

ENV_URL https://(監視対象URL)

トリガーの 追加

EventBridge(CloudWatchEvents)を追加します。
ルールは、新規ルールでルール名を「every5min」を指定します。ルールタイプはスケジュール式で以下を設定します。

説明: 5分毎
イベントバス: default
スケジュール式: cron(0/5 * * * ? *)

あとは、CloudWatch側で以下のようなアラートルールを設定することで監視完了です。

Lambdaはいろいろな使い方ができると思うので、引き続き使っていこうと思います。

[bug]マルチプロセスでlog4netのファイルローテーション時に一部ログが欠損して困った

福岡の香月です。

log4netのRollingFileAppenderを使って日付で出力ファイルが切り替わる設定をしていたところ、日付が変わって新しいファイルへの出力が始まると先頭に出力されるであろうログがなぜか出力されない現象に遭遇しました。
設定はこうです。
複数のプロセスで同じ設定を用いて、同じファイルに対してログ出力します。

[/crayon]

AppenderはRollingFileAppenderを指定しています。複数プロセスで使用するため、lockingModelはInterProcessLockを指定します。これによりファイルストリームを開きっぱなしにして、mutexで排他制御しながら末端にシークし書き込みを行うことで、複数プロセスから効率的にログ出力を行ってくれます。
複数プロセスから使う場合はこれ以外にもMinimalLockを指定できますが、書き込むたびにファイルのオープンクローズを実施するため速度が求められる場合は不向きでしょう。さらに複数プロセスからの出力が同時に走った場合、片方はオープンできないためログが出力されません。

この設定でビルドし、業務終わりにアプリを起動して一晩中実行させ、翌朝出社して確認しても日付が変わった後のログの内容が足りませんでした。
最初はlog4netの使い方が悪いのか、自分のプログラムにバグがあるのかさんざん悩んだんですがさっぱりわからない。トレース用に埋め込んだログも当然のように出ていないのでどうしたものかと思いました。

しかし、プロセスが1つの場合はちゃんと期待通りのログが出ていました。問題があるのは複数プロセスの場合だけだったのです。

そこでlog4netのロジックを確認することにしました。 幸いなことにソースはこちらから取得できます。
https://github.com/apache/logging-log4net
すると、ファイルが切り替わったあとは最後に書き込んだプロセスのログが先頭に来て、それ以前のログが破棄される作りになっていたのです。

少しずつソースを見てみましょう。今回使っているのはRollingFileAppenderです。日付が変わるときにファイルを切り替える部分は、RollOverTime()という関数であることがわかりました。こうなっています。
https://github.com/apache/logging-log4net/blob/master/src/Appender/RollingFileAppender.cs

[/crayon]

ふむふむ、SafeOpenFile()で新しいファイルをオープンしに行くわけね。そして第二引数がfalseと。そしてSaveOpenFile()の実態はベースクラスFileAppenderにありました。
https://github.com/apache/logging-log4net/blob/master/src/Appender/FileAppender.cs
ここから次の順番で呼び出されていきます。

  • RollingFileAppender.OpenFile()
  • FileAppender.OpenFile()
  • FileAppender.InterProcessLock.OpenFile()
  • FileAppender.LockingModelBase.CreateStream()
[/crayon]

ここでSafeOpenFile()の第二引数で指定されたfalseは、CreateStreamのappendに代入されていることがわかりました。この場合FileMode.Createが指定され、FileStreamインスタンスが作成されます。
ではこのFileMode.Createはどのような動きをするかというと、

オペレーティング システムが新しいファイルを作成することを指定します。ファイルが既に存在する場合は上書きされます。これには Write 許可が必要です。
FileMode.Create は、ファイルが存在しない場合は CreateNew を使用した要求、ファイルが存在する場合は Truncate を使用した要求と等価です。

https://docs.microsoft.com/ja-jp/dotnet/api/system.io.filemode?view=netcore-3.1

複数のプロセスでログ出力を行う場合、FileStreamを最後に作成するプロセスによりそれまでのプロセスが作成したログファイルの中身がTruncateされて、つまり削除されてしまうわけです。
発生している現象とも合致するのでこれが問題であることを確信しました。

対応するためにはRollingFileAppender.RollOverTime()から呼んでるSafeOpenFile()の第二引数をtrueに知ればよいわけです。実際に修正して確認してみると、見事欠損することなく必要なログが出力されていました。
めでたしめでたし。

なお、SafeOpenFile()はRollingFileAppender.RollOverSize()内からも呼び出しているのでここも忘れずにtrueに変更しましょう。

S3+CloudFront+Route 53を使った静的コンテンツ配信 Part 2 (lambda@edge編)

福岡拠点の野田です。

前回、S3を使った静的コンテンツ配信を実現しましたが、ちょっとカッコ悪い点がありました。

ドメイン直下については、 Default Root Object 設定すると https://サイト名/でアクセスしたときindex.html を参照するようにできます。ただし、サブディレクトリ配下はDefault Root Objectの設定が効きません。サブディレクトリ配下で/news/とアクセスしたとき、/news/index.htmlを参照するためにはlambda@edgeを使う必要があります。

/で終わるuriの場合に/index.htmlを参照する設定について、今回は以下の流れで設定を行います。

  1. lambdaを追加
  2. CloudFrontで使えるようにIAMを修正
  3. lambdaにトリガーを追加し、CloudFrontと関連付け

lambdaを追加

リージョンus-east-1のlambda画面から関数を追加します。ほかのリージョンではCloudFrontへのトリガーを作成できないため、正しいリージョンが選択されているか確認してください。

https://console.aws.amazon.com/lambda/home?region=us-east-1

lambdaは1から作る形で進めます。

・関数名:subdir-redirect (適宜適当な名前を設定してください)
・ランタイム:nodejs (バージョンはデフォルトでOK)
・アクセス権限:AWSポリシーテンプレートから新しいロールを作成
・ロール名:cloudfront-lambda (適宜適当な名前を設定してください)
・ポリシーテンプレート:基本的なlambda@edgeのアクセス権限

関数詳細ページが表示されるので、関数コードに以下を追加します。

[/crayon]

画面右上の「保存」を押下してコードを保存します。

CloudFrontで使えるようにIAMを修正

そのままでは使うことができないため、関数詳細ページ「アクセス権限」のタブを選択します。実行ロール「 cloudfront-lambda 」を編集し、末尾の「 IAM コンソールで cloudfront-lambda ロールを表示します。」のリンクをクリックします。

ロールの詳細ページから「信頼関係」のタブをクリックします。「信頼関係の編集」ボタンを押下して、以下のようにedgelambdaの設定を追加します。

[/crayon]

これにより信頼されたエンティティにedgelambdaが追加されます。

信頼されたエンティティ
ID プロバイダー lambda.amazonaws.com
ID プロバイダー edgelambda.amazonaws.com

続いて「アクセス権限」のタブに再度戻ります。+インラインポリシーの追加から以下のポリシーを追加します。

  • Lambda: GetFunction, EnableReplication (対象リソースは、先ほど登録したsubdir-redirect lambda のARNを指定)
  • IAM: CreateServiceLinkedRole(対象リソースはすべて)
  • CloudFront: UpdateDistribution(対象リソースは、展開するCloudFrontのARNを指定)

ここまでやってようやくlambda@edgeが使えるようになります。

lambdaにトリガーを追加し、CloudFrontと関連付け

仕上げにlambdaの関数詳細画面に戻ります。画面上の「アクション」から新しいバージョンを発行します。コメントは必要あれば適宜入力してください。

そののちにデザイナーから「トリガー」を追加します。トリガーの種類は、CloudFrontを選択します。ここでCloudFrontが選択できない場合はlambdaのリージョンが間違っていますので、最初からやり直してください。設定はデフォルトのままで以下のチェックボックスにチェックを入れます。

[/crayon]

追加ボタンを押下するとCloudFrontへの更新が入ります。Distributionの更新が終わるまでしばし待つと、晴れてサブディレクトリのリダイレクト処理を利用することができるようになります。

まとめ

lambdaというと単機能のAPIや軽量サーバーとして使うイメージが強いですが、実はいろいろなところに組み込めます。lambda@edgeを利用することでCloudFrontに対してヘッダーのカスタマイズ、 BASIC認証など多岐にわたって処理を組み込むことができます。静的コンテンツに対してちょっとした動的処理を行いたいな、というときはlambda@edgeの出番です。是非ご活用いただければと思います。

面倒なところもありますが、ひと手間かけるといろいろなことができるのがAWSの良いところ。いろいろエンジニアとしていろいろHackしていければと思います。

S3+CloudFront+Route 53を使った静的コンテンツ配信

福岡拠点の野田です。

WordPressで運用していた個人サイトをメンテしなくなったので、S3とCloudFrontとRoute 53を使って静的コンテンツ配信方式に切り替えてみました。手順の大きな流れは以下のようになります。

  1. S3にコンテンツを配置
  2. CloudFrontを設定
  3. Route53でCloudFrontへ振り分け

S3 にコンテンツを配置

まずは、wget で既存サイトを取得します。

[/crayon]

日本向けに配信することを考え、 S3 の東京リージョンにて新規バケットを作成して、上記取得したファイルを配置します。

S3における設定ですが、アクセス権限の設定を行います。静的コンテンツとして公開するため、以下のバケットポリシーのブロックをオフにすることで外部からのアクセスを行えるようにします。

  • 新規のパブリックバケットポリシーまたはアクセスポイントポリシーを介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックするオフ
  • 任意のパブリックバケットポリシーまたはアクセスポイントポリシーを介したバケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックするオフ

バケットポリシーは、以下のようなCloudFrontからの接続を許可する設定を行いますが、CloudFront側から設定ができるため、ひとまずスキップで大丈夫です。

[/crayon]

CloudFrontを設定

Create DistributionでCDNを新規作成します。

  1. Web/RTMPの選択でWebを選択
  2. Origin Domain NameにS3のバケットを選択
  3. Origin Pathは空欄でOK
  4. Origin IDは任意のIDを設定(S3-バケット名みたいな感じで設定しました)
  5. Restrict Bucket Accessは、YES
  6. Origin Access Identityは、 Create a New Identity。
  7. Grant Read Permissions on Bucketは Yes, Update Bucket Policy (これが先ほどのS3バケットポリシーに反映されますので、一応S3側でも設定されているか確認)
  8. Viewer Protocol Policyは、Redirect HTTP to HTTPS (httpからhttpsリダイレクト)
  9. Allowed HTTP Methodsは、GET/HEADのみで対応(CORSを考えるとOPTIONSまでやってもいいかもしれません)
  10. Compress Objects Automaticallyは、true(圧縮化。転送量削減)
  11. Price Classはベストパフォーマンス
  12. AWS WAF Web ACLは、None
  13. Alternate Domain Namesは割り当てるドメイン名を改行区切りで入力。
  14. 証明書については、独自ドメインで割り当てる場合、ACMに登録したものを選択。
  15. 残りはデフォルトで登録

Distribution作成後、 GeneralタブでEditボタンを押下して、以下を設定します。

  1. Default Root Objectにindex.htmlを設定

続いて Restrictionsタブを選択して、GeoRestrictionをEditします。

今回は、日本のみを対象とします。全世界を対象とするとコストと直結します。1日1000円以上かかってもいい!どんな攻撃もどんとこい!という方以外は、対象を絞ったほうが良いと思います(私もこれで当初1日放置して1000円かかってしまい冷や汗、急遽制限を追加しました)。

Route53でCloudFrontへ振り分け

仕上げにRoute53からCloudFrontへ振り分けします。A(IPv4アドレス)およびAAAA(IPv6アドレス)のエイリアス指定でCloudFrontにつなげることができます。

まとめ

Cloudは設定をミスると高額な請求が発生してしまうリスクはありますが、うまく使えば個人で使っても安く運用することができます。最近では予算設定や請求が高額になりそうなときにアラートも出せる機能もありますので、そうしたものを組み合わせて、安全に運用すると良いと思います。先月からの運用の感じだとアクセス数次第なところがありますが、100円~300円/月ぐらいで運用できそうな感じでした。

初心者にはおすすめはしませんが、興味ある方は是非チャレンジしてみてください。