<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CI/CD on ゲンゾウ用ポストイット</title><link>https://genzouw.com/entry/category/ci-cd/</link><description>Recent content in CI/CD on ゲンゾウ用ポストイット</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Thu, 17 Aug 2023 08:33:47 +0900</lastBuildDate><atom:link href="https://genzouw.com/entry/category/ci-cd/index.xml" rel="self" type="application/rss+xml"/><item><title>OIDCを使ってGithub ActionsからAWSにアクセスする仕組みについて理解を整理してみた</title><link>https://genzouw.com/entry/2023/08/16/174745/3549/</link><pubDate>Wed, 16 Aug 2023 17:47:45 +0900</pubDate><guid>https://genzouw.com/entry/2023/08/16/174745/3549/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Github Actions から AWS クラウドリソースを操作するために&lt;code&gt;ACCESS_KEY&lt;/code&gt;、&lt;code&gt;SECRET_ACCESS_KEY&lt;/code&gt;を使う方法はもう古い、OIDCを使うのが一般的といわれましたが理解していなかったため整理しました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;今回取り上げる &lt;strong&gt;CI/CD ( ビルド ) パイプライン&lt;/strong&gt; は &lt;strong&gt;Github Actions&lt;/strong&gt; に限定しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;クラウドプロバイダー&lt;/strong&gt; に関しても、 &lt;strong&gt;AWS&lt;/strong&gt; に限定しています。&lt;/p&gt;&#10;&lt;p&gt;ただしアーキテクチャはCI/CDパイプラインがCircleCIやCloudBuild、クラウドプロバイダーがGCPやAzureに置き換えられたとしても適用可能なものと考えられます。&lt;/p&gt;&#10;&lt;h2 id="パスワードやアクセストークンを使ってgithub-actionsからクラウドへ認証する方法の問題点"&gt;パスワードやアクセストークンを使ってGithub Actionsからクラウドへ認証する方法の問題点&lt;/h2&gt;&#10;&lt;p&gt;Github ActionsのようなCI/CDパイプラインから、クラウド環境 ( AWS、Azure、GCP&amp;hellip; ) にアクセスするケースは多いはずです。&lt;/p&gt;&#10;&lt;p&gt;ビルドされたソフトウェアやコンテナイメージはいずれデプロイされますし、デプロイ環境としてクラウド環境 ( ex: AWS ) が利用されることが多いからです。&lt;/p&gt;&#10;&lt;p&gt;Github Actionsがクラウド上のリソースにアクセスするために、事前にパスワードやアクセストークンといった認証情報を取得しておく必要があります。&lt;/p&gt;&#10;&lt;p&gt;これらの認証情報はGithubの &lt;strong&gt;secrets&lt;/strong&gt; に保存することが多いでしょう。&#10;Github Actionsワークフローは実行のたびに &lt;strong&gt;secrets&lt;/strong&gt; から認証情報を取り出し、これを使ってクラウド環境へのアクセスを可能にします。&lt;/p&gt;&#10;&lt;p&gt;しかし、このような &lt;strong&gt;secrets&lt;/strong&gt; を使う方法には問題があります。&#10;以下のような手間が発生します。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;クラウド上のIAMサービスで認証情報を生成する&lt;/li&gt;&#10;&lt;li&gt;生成した認証情報をGithubのsecretsに登録する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;つまり、認証情報が二重管理されることになります&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;h2 id="oidc--openid-connect--を使うメリット"&gt;OIDC ( OpenID Connect ) を使うメリット&lt;/h2&gt;&#10;&lt;p&gt;そこで登場するのがOIDC ( OpenID Connect ) です。&lt;/p&gt;&#10;&lt;p&gt;OIDCを使うと、Github Actionsワークフローがクラウドプロバイダーに対して要求するアクセストークンは、有効期限の短いものとなります。&lt;/p&gt;&#10;&lt;p&gt;もちろんOIDC認証による認証をサポートされているクラウドプロバイダーでしか利用できない方式ではありますが、現在はほとんどのクラウドプロバイダー ( AWS、Azune、GCP、HashiCorp Vault&amp;hellip; ) がOIDCをサポートしています。&lt;/p&gt;</description></item><item><title>GCPにSpinnakerをインストールするための手順を整理しました</title><link>https://genzouw.com/entry/2021/02/12/214915/2199/</link><pubDate>Fri, 12 Feb 2021 21:49:15 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/12/214915/2199/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;前回でようやくSpinnakerが生まれてきた背景やできることを大まかにつかめました。&lt;/p&gt;&#10;&lt;p&gt;ここからは実際にインストールしてみたいと思います。&lt;/p&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B084ZCYL4V&amp;linkId=a13517124ec4a6224d2c89648f7aa9e3"&gt;&lt;/iframe&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;選定&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;クラウド&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GCP ( Google Cloud Platform )&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;デプロイ環境&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GKE ( Google Kubernetes Engine )&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Spinnakerインストール環境&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GCE ( Google Compute Engine )&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1zeebpQSAd7s7ZsKqENPx5VXGtjsOVkF3" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作業用PCで &lt;code&gt;gcloud&lt;/code&gt; コマンド ( &lt;strong&gt;Google Cloud SDK&lt;/strong&gt; ) が実行できること&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;GCP&lt;/strong&gt; 上に &lt;strong&gt;GKEクラスタ&lt;/strong&gt; が構築済みであること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作業用pc-での作業"&gt;&lt;strong&gt;作業用PC&lt;/strong&gt; での作業&lt;/h2&gt;&#10;&lt;p&gt;まずは自分の作業用PCで作業を行います。&lt;/p&gt;&#10;&lt;h3 id="1-コマンドラインから各種作業を実行するための準備"&gt;1. コマンドラインから各種作業を実行するための準備&lt;/h3&gt;&#10;&lt;p&gt;コマンドラインで作業を進めていくに当たり、いくつかのAPIを &lt;strong&gt;有効化&lt;/strong&gt; します。&lt;/p&gt;&#10;&lt;p&gt;以下の2つの Google APIを有効にします。&#10;&lt;strong&gt;Google Cloud Console&lt;/strong&gt; Webページから有効にしても良いですが、ここでは &lt;code&gt;gcloud&lt;/code&gt; コマンドで有効化します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://console.developers.google.com/apis/api/iam.googleapis.com/overview?pli=1"&gt;Google Identity and Access Management (IAM) API&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://console.developers.google.com/apis/library/cloudresourcemanager.googleapis.com?project=genzouw-com&amp;amp;folder=&amp;amp;organizationId="&gt;Google Cloud Resource Manager API&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gcloud services &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; iam.googleapis.com &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cloudresourcemanager.googleapis.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="2-halyardをインストールする-compute-engine-インスタンスを作成"&gt;2. Halyardをインストールする &lt;strong&gt;Compute Engine&lt;/strong&gt; インスタンスを作成&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Halyard&lt;/strong&gt; をインストールする &lt;strong&gt;Compute Engineインスタンス&lt;/strong&gt; を作成します。&lt;/p&gt;</description></item><item><title>本番環境で環境依存の問題が散見されたのでSpinnakerの導入を検討してみました</title><link>https://genzouw.com/entry/2021/02/11/080037/2187/</link><pubDate>Thu, 11 Feb 2021 08:00:37 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/11/080037/2187/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;会社で、 &lt;strong&gt;検証環境&lt;/strong&gt; では障害が発生しないが &lt;strong&gt;本番環境&lt;/strong&gt; では障害が発生する、といったことが何度か続きました。&lt;/p&gt;&#10;&lt;p&gt;原因は &lt;strong&gt;検証環境&lt;/strong&gt; と &lt;strong&gt;本番環境&lt;/strong&gt; のクラウドサービスの設定の差異でした。&#10;再現性のある方法でクラウド上の環境を構築してこなかったことが原因ではありますが、できてしまっているものはしょうがないです。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「カナリアデプロイ」&lt;/strong&gt; と呼ばれる、 &lt;strong&gt;本番環境&lt;/strong&gt; に部分的にデプロイして動作確認し、問題なければ全展開するデプロイ方法があります。&#10;これはぜひ導入したい！そこで見つけた名前が &lt;strong&gt;Spinnaker&lt;/strong&gt; でした。&lt;/p&gt;&#10;&lt;p&gt;Spinnakerを使って「カナリアデプロイ」が実現できる、という話を耳にしたので調べてみました。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph LR;&#10; load_balancer--&amp;gt;|95% Traffics| web_server(Web Server);&#10; load_balancer--&amp;gt;|5% Traffics| new_web_server(Web Server); subgraph Old&#10; web_server--&amp;gt;applicacion_server(Application Server)&#10; applicacion_server(Application Server)--&amp;gt;database(Database);&#10; end &#10; subgraph New&#10; new_web_server--&amp;gt;new_applicacion_server(Application Server)&#10; new_applicacion_server(Application Server)--&amp;gt;new_database(Database);&#10; end &#10;&lt;/code&gt;&lt;/pre&gt;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B084ZCYL4V&amp;linkId=a13517124ec4a6224d2c89648f7aa9e3"&gt;&lt;/iframe&gt;&#10;&lt;h2 id="継続的インテグレーション-ci-"&gt;継続的インテグレーション( &lt;strong&gt;CI&lt;/strong&gt; )&lt;/h2&gt;&#10;&lt;p&gt;素早いソフトウェアの改善・改良や新機能追加が求められる時代がありました。（当時は僕もJavaばっかり触っていました。）&lt;/p&gt;&#10;&lt;p&gt;当時、開発された分割モジュールを統合してビルドすると、、、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ビルドに失敗する！&lt;/li&gt;&#10;&lt;li&gt;正常に動作しない！&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;なんてことはよくありました。&lt;/p&gt;&#10;&lt;p&gt;そこで偉い人？が「開発の早い段階から継続的に以下のステップを実施すればいいんじゃね？」と考えました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;コードチェック&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ビルド&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ユニットテスト&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;こうして、継続的インテグレーション(CI)が誕生しました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="継続的デリバリ-cd-"&gt;継続的デリバリ( &lt;strong&gt;CD&lt;/strong&gt; )&lt;/h2&gt;&#10;&lt;p&gt;更に時が過ぎ、「継続的インテグレーション」を更に推し進める思想が生まれました。&lt;/p&gt;&#10;&lt;p&gt;偉い人？が「ソフトウェアのデプロイも継続的に、自動的に行ったらいいんじゃね？」と考えました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;こうして、継続的デリバリ(CD)が誕生しました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;ちなみに、 &lt;strong&gt;「継続的デリバリ」&lt;/strong&gt; を行うためには、以下の2つが必要となります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ビルドされたパッケージ&lt;/li&gt;&#10;&lt;li&gt;パッケージを運用環境にデプロイする手段&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;それを踏まえて、昨今の状況の話に移ります。&lt;/p&gt;</description></item></channel></rss>