S3上の静的HTMLをカスタムドメインでCloudFrontから配信するサンプル

概要 AWS の理解向上を兼ねて、CloudFront で S3 上の HTML を配信する構成のサンプルを terraform で構成してみました。 AWS Certificate Manager (ACM) で証明書を発行し、CloudFront に割り当てて、カスタムドメインで配信します。 実際のソース 下記に配置しています。 https://github.com/hirokimatsueda/aws-cf-s3-terraform-sample 実行時の前提 CloudFront に割り当てる親ドメインを管理する DNS 名前解決が可能な Route 53 がすでに構築されていること 実装ポイント CloudFront の制約上、ACM を us-east-1 に構築する必要があるため、コードの簡素化のため全てのリソースを us-east-1 に構築しています provider "aws" { region = "us-east-1"# CloudFront用のACMの要件に沿って設定 access_key = var.aws_access_key secret_key = var.aws_secret_key } S3 は CloudFront 以外からパブリックなアクセスをさせたくないため、IAM ポリシーを使用して CloudFront のみからアクセス可能にしています data "aws_iam_policy_document" "static_site" { statement { sid = "AllowCloudFront" effect = "Allow" principals { type = "AWS" identifiers = [ var....

March 24, 2024

AKS使いの私がEKS構築でハマったこと

概要 Azure にも AWS にもマネージドな Kubernetes があり、それぞれ Azure Kubernetes Service (AKS) と Amazon Elastic Kubernetes Service (EKS) という名前です。 AKS(に限らず Azure のサービス)は、Azure ポータルから構築を進めるとすぐに使えることが多いです。 EKS も AKS と同じノリでポータルで構築したらなかなか動かなかったので、ハマったポイントを共有します。 ノードグループを追加しないと動かない Kubernetes はワーカーノードが無いと Pod を動かすことができません。 AKS の場合、ワーカーノードを動かすためにはノードプールを用意する必要があります。 Azure ポータルから AKS クラスタを構築するときはノードプールの作成がデフォルトで指定されており、更にノードプール(厳密にはシステムモードのノードプール)の作成を指定していないとそもそも AKS 自体を構築できません。 これに対して EKS の場合は、AWS コンソールから EKS クラスタを作成しただけではワーカーノードを動かすために必要なノードグループを作成してくれません。 クラスタはできているので、EKS に対してマニフェストファイルを apply する分には実行できるのですが、待っていても永遠に Pod が立ち上がりません。 永続ボリュームとしての EBS のマウントにはアドオンを追加する必要がある AKS の場合、永続ボリュームとしてマネージドディスクをマウントする場合、StorageClass や Persistent Volume Claim のマニフェストファイルを用意していけば使えるのでアドオンを意識することはありませんでした。 クラスタの構築時も特にアドオンの選択はさせられません。 EKS の場合は、クラスタの構築後にアドオンで EBS CSI driver を追加しないと EBS を永続ボリュームとして利用できません。...

March 23, 2024

Application Insightsでお手軽にお安く?HTTP監視しよう

皆さんはパブリックに公開したシステムの正常稼働をどのように監視していますか? 私は趣味でレンタルサーバーを常時動かしているのですが、HTTP 監視を行い不具合の検出をすぐに行えるようにしています。 監視には Azure の Application Insights を利用しており、利用料金も私の使い方であれば格安ですので、こちらをご紹介したいと思います。 HTTP 監視とは? HTTP 監視とは、監視対象に対して定期的に HTTP のリクエストを送信し、その応答(200 応答するか?など)を確認する監視方法です。 サーバー内部の不具合までは見られませんが、サーバーが落ちていないなど、ある程度の正常稼働を認識することができます。 Application Insights による HTTP 監視 Azure の Application Insights を利用すると、お手軽に HTTP 監視を構成できます。 可用性テストという名称です。 Application Insights を構築し、Azure ポータルから「可用性」の画面を開くと設定を追加できます。 「クラシックテスト」と「標準テスト」が存在しますが、「標準テスト」で実現することになります。 (Azure で「クラシック」と名の付くものは廃止されていく運命にあることが多いです) 標準テストのドキュメントに沿って設定してみましょう。 Application Insights の構築・設定時のポイント Application Insights の構築時に 2023/08/19 現在は「リソース モード」の選択がありますが、「クラシック」ではなく「ワークスペースベース」を選択します。クラシックは廃止予定の構成です。 URL にはポート番号の指定も可能ですので、通常のポート(HTTPS なら 443 とか)以外に対してもテストできます 東日本リージョンの Application Insights の場合、テスト 1 回につき $0.0008 のコストなので、要件に合わせて「テストの頻度」と「テストの場所」の数を調整しましょう 警告を「有効」にして追加の設定を入れ込むことで、HTTP 応答に問題があった際にメール通知等ができます 趣味程度の使い方の場合の料金は? 趣味程度のサーバーなので、テストの頻度を 15 分毎、テストの場所を Japan East にしていますが、1 日当たり 8....

August 19, 2023

ストレージアカウントのPremiumな選択肢を覚えてみる

皆さん、Azure の Premium なオプションはどれくらい使えていますか? 私は WebApps と SQL Database がぱっと頭に浮かびますが、よく考えるといろいろありますよね。 Microsoft Learn を参考に、ストレージアカウントの選択可能なオプションを覚えるため整理してみたいと思います。 ストレージ アカウントの種類 https://learn.microsoft.com/ja-jp/training/modules/design-data-storage-solution-for-non-relational-data/3-design-for-azure-storage-accounts Azure ポータルからデフォルト設定で構築していくと、「Standard 汎用 v2」が選択されると思います。 こちらを使えば、よくある Web サイト等を動かすには十分な性能のものが利用でき、安価にデータを保管できます。 必要に応じて CDN などの他のサービスも組み合わせますかね。 これに対し、「Standard 汎用 v2」以外には下記の Premium なオプションがあります。 Premium ブロック BLOB Premium ファイル共有 Premium ページ BLOB 「Standard 汎用 v2」の場合、Blob Storage (Data Lake Storage を含む)、Queue Storage、Table Storage、Azure Files の 4 つのサービスが提供されますが、上記の Premium なオプションを利用した場合は特定のサービスにサポートが限定されます。 各オプションについて、高いスループット以外のドキュメント上で気になるところをピックアップしていきます。 (2023/7/28 時点のドキュメントからピックアップ) Premium ブロック BLOB 高速の一貫した応答時間を要するワークロードや、小さな読み書きが大量に行われるワークロードに適している コスト効率で言うと、トランザクションコストが低く設定されており、使用方法によっては「Standard 汎用 v2」よりも安くなる場合も考えられる Premium ファイル共有 サーバー メッセージ ブロック (SMB) と NFS ファイル共有の両方をサポートする必要がある場合に利用 最大同時要求レートは 100,000 IOPS で、Standard の 20,000 IOPS よりはるかに高い ストレージアカウントの最大容量は(100TiB)で、Standard の 5PiB より小さい Premium ページ BLOB BLOB あたり最大 7,500 IOPS と 250MBps のプロビジョニングされたディスク パフォーマンスを提供 サイズは固定で最大 8TB 補足:Blob のアクセス層 https://learn....

July 28, 2023

Terraformを使ってAKS上にFluxを導入する手順とデモ

はじめに GitOps は、開発者がコードを Git リポジトリにプッシュすることで自動的にインフラストラクチャーが更新される仕組みです。 Flux は、GitOps を実現するためのツールであり、Kubernetes の manifest ファイルを Git リポジトリに保存し、変更があるたびに自動でデプロイすることができます。 本記事では、Terraform を用いて AKS 上に Flux を導入する手順を説明し、GitOps のデモを行います。 AKS 上に Flux を導入する手順 連携先の GitHub リポジトリの準備 GitHub リポジトリが空だと Terraform の実行時にエラーになるため、main ブランチに readme か何かを入れておいてください。 続いて GitHub との認証情報の準備です。 今回は Deploy key を用いて Flux から GitHub に接続する方針で説明します。 Deploy key の作成方法は下記です。 接続に使用する SSH キーを生成します 参考:https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key 対象のリポジトリの「Setting」から、「Deploy keys」を開きます 「Add deploy key」をクリックします Title に任意の名称を設定し、SSH キーの公開鍵をコピペし、「Allow write access」のチェックを入れて「Add key」します SSH キーの秘密鍵は Terraform の実行時に必要になります。...

July 6, 2023

ChatGPT が子供向けの曲を作ったらどうなる?

社内で爆発的に流行っている ChatGPT に手を出したら、とてもハマってしまいました。 信長の野望以来のマイブーム? 隙間時間に無理難題を問いかけて、反応を楽しんでいます。 問いかけに対してうまく答えたり答えなかったりするところが、何となく子育てに近い感じがします。 ちょっとお遊びですが、子供向けの曲を作ってもらおうとしてみました。 まずは作詞! すごくアバウトに振ってみましょう。 架空の子供番組の歌を作って ↓ lyrics 1 それっぽい!? 最後の歌詞を見る限りは、オープニング曲というよりエンディング曲ですかね? コード進行は作れるか? 続いて曲にするためにコード進行を決めていきましょう。 良いね! コード進行を教えて ↓ chord progression 1 う~ん・・・流石にこれは詰まらなすぎます。 ちょっとつまらないので、ヴァースで変化をつけて ↓ chord progression 2 (ヴァースじゃなくてコーラスで変化を付けさせるべきだった気も・・・) いやぁ・・・これもちょっとなぁ。 私の好きな、某イスが主役の番組の音楽とか想像すると物足りないです。 最近の子供番組はもっと複雑な進行になる印象です。 もう少し思い切った形になりますか? ↓ chord progression 3 ちょっとやり過ぎな感じもしますが、良しとしますか! コードに合わせて歌詞を調整 ブリッジが追加されて歌詞との対応関係が崩れたようなので、歌詞を調整してみます。 良いですね、このコードに沿って歌の歌詞を調整してください。 ↓ lyrics 2 lyrics 2 やはりエンディング曲な締めですが、弾き語りで使えそうなメモになってきました。 メロディーラインも作れるか? ここまで来たらメロディーラインも作ってほしいですね。 メロディラインを作ってください ↓ melody 1 途中で回答の生成を止めちゃいましたが、音楽の生成をやろうとしてたので、文字で再度書いてもらうことに。...

May 13, 2023

Azureお父さん必見!赤ちゃんのうんち記録アプリで子育てをDX!?

※ この記事は、cloud.config Tech Blog にもマルチポストする予定です 子供が産まれて妻子の入院期間中、体温や授乳回数やおしっこ・うんちの時間を記録する紙があって、そこに毎日記録していました。 退院後もそのフォーマットを Excel で真似て紙に印刷して使っていて、子供の不調が無いか確認していました。 子供が 1 歳になった今も一応、記録内容を減らした紙を運用してはいるものの、ほとんど問題ないのであまり書いていないです。 ただその中で、絶対書いておきたいのが、 うんちの記録です! 便秘だと不機嫌になったり場合によっては病院に行かないといけなくなります。 うちの子は最近は割と快便ですが、最初の頃は便秘でとても心配しました。 また、うんちがあまり出ていない状態でお風呂に入ると・・・ね。。 ということで、うんちの回数を記録するアプリを書いてみましたのでご紹介です。 Screen shot アプリの概要 カレンダーの中の「+」ボタンを押すと、当日の枠に 💩 マークがつきます。 データは Cosmos DB に保管されます。 アプリコード Visual Studio 2022 で作成しました。GitHub で見れるようにしています。 https://github.com/hirokimatsueda/baby-info-recording-system フロントアプリの実装は大目に見てください。。 フロントの作りが微妙ですが・・・赤ちゃん ID を変更すると別々のデータを管理できるので、双子や兄弟のデータも扱えます。 アーキテクチャ概要 インフラとしては Azure の Static Web Apps での動作を想定し、情報を CosmosDB に保存するので、比較的安価に運用できるものになっています。 アプリは ASP.NET Core Blazor での記述です。 インフラもアプリも、ベースとなる考え方は以前ブログでご紹介した下記のコードです。 https://github.com/hirokimatsueda/azure-managed-id-sample インフラ構築 Api は Static Web Apps のデフォルトの機能で動かすと Managed ID が使えないため、Static Web Apps とは別で構築した Functions を Static Web Apps にリンクする形を取るのがポイントです。...

December 2, 2022

実用性重視!AzureのマネージドID活用のサンプルコード(アプリコード)

※ この記事は、cloud.config Tech Blog にもマルチポストする予定です 下記のサンプル実装のアプリコード部分を解説します。 https://github.com/hirokimatsueda/azure-managed-id-sample アプリ処理詳細 コードはこちら: https://github.com/hirokimatsueda/azure-managed-id-sample/blob/main/applications/DataApis 詳細と言うほどのものではないですが・・・。 GetData リクエストパラメータから id と category を読み取って、対象のデータを Cosmos DB から取得し返却します。 PutData リクエストボディのデータを Cosmos DB に Upsert します。 実装のポイント マネージド ID という観点で言うと、CosmosClient に渡すクレデンシャル情報に new DefaultAzureCredential() を指定するくらいです。 private static CosmosClient InitializeCosmosClient() { return new CosmosClient(Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process), new DefaultAzureCredential()); } これにより Functions 上ではマネージド ID のクレデンシャルが使用されます。 ローカル PC 上で実行する場合は、ローカル PC 上の認証情報を使用してくれるので、例えば az login したユーザーが Cosmos DB のデータへのアクセス権限を持っていればローカル PC でデバッグが可能です。 ほかのポイントとしては、CosmosClient をメソッド呼び出し時に生成するのではなく Static 変数として持っておき、Lazy クラスを活用した初期化を実施しています。...

August 20, 2022

実用性重視!AzureのマネージドID活用のサンプルコード(インフラコード)

※ この記事は、cloud.config Tech Blog にもマルチポストする予定です 下記のサンプル実装のインフラコード部分を解説します。 https://github.com/hirokimatsueda/azure-managed-id-sample インフラ構成詳細 Architecture 概要記事で「シンプル」と表現しましたが、構築されるリソースを明記すると若干インパクトがあるかもしれません。 しかしかなり最低限だと思いますのでどうかお付き合いを・・・。 本質的に必要なのは、中央の Functions と Cosmos DB です。 Cosmos DB の中にはデータベースやコンテナーの概念があるので、これらもインフラ構築時に作成してしまいます。 Azure のリソースは「診断設定」を設定するとリソースの状態が観測できるので、Functions と Cosmos DB に対して設定しておきます。診断ログの保管先として Log Analytics を指定しています。 Functions のアプリの状態の観測のため、Application Insights と接続しています。 Functions ではシステム割り当てマネージド ID を有効にして、Cosmos DB の権限設定でこのマネージド ID が Cosmos DB 内のデータを操作することを許可します。 terraform を用いた構築 コードはこちら: https://github.com/hirokimatsueda/azure-managed-id-sample/tree/main/infrastructure/terraform Azure のインフラ構築には terraform を利用しています。 terraform についての説明は割愛させていただき、どのような方針で実装しているかを記載します。 module への処理の分割 terraform は、カレントディレクトリ配下(サブディレクトリを除く)の tf ファイルをすべて確認してインフラ構築をしてくれますが、リソース数が多い場合はコードの見通しが悪くなりがちです。 この時、modules という概念を使用すると処理の詳細を別フォルダに整理できるので見通しが良くなります。 マネージド ID への権限付与 下記の実装で権限付与を行っています。 https://github.com/hirokimatsueda/azure-managed-id-sample/blob/main/infrastructure/terraform/modules/cosmos_db_sql/main.tf...

August 20, 2022

実用性重視!AzureのマネージドID活用のサンプルコード(概要)

※ この記事は、cloud.config Tech Blog にもマルチポストする予定です Azure のマネージド ID は分かれば非常に有用な概念なのですが、いざ実装するとなった場合、インフラとアプリケーションが密接に関わっていることもあってハードルが高く思うケースがあると思います。 そんな皆様のために、いつもの当たり障りのない記事ではなく、しっかり実用的に使えるコードを用意しました。 早速全体像をご紹介します。 サンプルコードの概要 コードは下記にあります。 https://github.com/hirokimatsueda/azure-managed-id-sample 何らかのデータを Functions を経由して Cosmos DB に保管・取得するアプリとインフラのコードのサンプルです。 データは少なくとも id と category の値を持つことを想定します。こんな感じで。 { "id": "abc123", "category": "test", "data": "aaaabbbbcccc" } category は Cosmos DB 上のパーティションキーとして設定しますので、一定の法則で値が入ると良いことがありそうですね。 アーキテクチャ Architecture ユーザーからのリクエストを Functions で受け取り、Cosmos DB とデータのやり取りをするシンプルな構成です。 Functions の認証は Functions の webbook の API キーを利用します。 Functions から Cosmos DB にアクセスする手段は様々なものがありますが、表題の通りマネージド ID を使用を想定しています。 コードの構成 applications フォルダに Functions 上で動作する C#のアプリケーションがあり、infrastructure フォルダに Azure リソースを構築するための terraform のコードがあります。...

August 20, 2022