<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>blog.monophile.net</title>
    <link href="https://blog.monophile.net/atom.xml" rel="self" />
    <link href="https://blog.monophile.net" />
    <id>https://blog.monophile.net/atom.xml</id>
    <author>
        <name>Takaaki Yamamoto</name>
        <email>webmaster@monophile.net</email>
    </author>
    <updated>2023-09-11T00:00:00Z</updated>
    <entry>
    <title>トレーニングを始めた理由とアンチ・ドーピングの方針について</title>
    <link href="https://blog.monophile.net/posts/20230911.html" />
    <id>https://blog.monophile.net/posts/20230911.html</id>
    <published>2023-09-11T00:00:00Z</published>
    <updated>2023-09-11T00:00:00Z</updated>
    <summary type="html"><![CDATA[<h1 id="まえがき">まえがき</h1>
<p>直近 2 年ほど、健康の増進を主な目的とし、有酸素運動や筋力トレーニングを行っている。
その延長線上で審美的な観点でのボディメイクも目的としている。
今後も有酸素運動や筋力トレーニングを継続しようと考えているが、同時に情報発信をしていければと考えている。
健康や審美に関わる事柄は、どのような方針の下での活動かが重要になるかと考えているため、自分の背景や考えをまず記しておく。</p>
<h1 id="トレーニングをはじめたきっかけ">トレーニングをはじめたきっかけ</h1>
<p>2020 年のはじめにコロナウィルスが流行し始めた。
それに伴って、自分の本職である IT エンジニア (i.e., SRE, DevOps Engineer) の業務が基本リモートに移行した。
徒歩と電車による通勤がなくなり、それらによるストレスがなくなるというメリットはあったものの、デメリットもあった。
主には体力の低下だった。</p>
<p>リモートによる業務が 1 年くらい継続し、外出する頻度が1週間に1回ほどの近所への買い物程度になった。
そんな生活を過ごしていたのだが、ある日のこと、家から徒歩 1 分のコンビニに買い物に行った際、
階段でやや息切れがしたことに加え、翌日に筋肉痛が来た。
あまりの体力の低下に危機感を覚え、筋力低下や運動不足による健康への影響を考慮し、
明確に運動する機会を設けようと考えたことが最初のきっかけだった。</p>
<p>運動不足を解消するためにまず行ったのはランニングである。
2021 年冬頃からランニングは下記のような強度と頻度で行った。</p>
<ul>
<li>1 回あたりの走行距離: 3-5 km</li>
<li>ペース: 約 6 分/km</li>
<li>頻度: 2 週に 1 回くらい</li>
</ul>
<p>上記のランニングをおおよそ半年くらい続けたところ、体力が戻ってきた感覚があった。
何より食事が美味しかったという記憶がある。
体力が戻ってきたため、ステップアップとして近所の大手スポーツジムを契約したのが 2021 年の夏頃だったかと思う。</p>
<h1 id="トレーニング内容の変遷">トレーニング内容の変遷</h1>
<p>2021 年の夏から 2023 年の夏 (現在) までのトレーニング内容や頻度を簡単に紹介する。</p>
<p>2021 年の夏頃にジムを契約してから 半年ほどは週に 1 回の頻度でジムに通い筋力トレーニングとエアロバイクによる有酸素運動を行った。
その半年後、2022 年の初頭から下記を並行して行うようにした。</p>
<ul>
<li>ジムでの筋力トレーニングとエアロバイク (週に1回)</li>
<li>路上での 5 km のランニング (週に1回)</li>
</ul>
<p>土曜にランニングを行い、日曜にジムに行き筋力トレーニングをする、ということが多かったと思う。
体重はあまり増やしたくなかったため、体重の増減はほぼなく、あっても +2 kg ほどだったかと思う。</p>
<p>2022 年の夏あたりから筋肥大を明確に目指すようになり、ジムに行く頻度を増やした。
有酸素運動をジム内のトレッドミルやエアロバイクで代用し、路上でのランニングはほとんど行わなくなった。
2023 年の夏 (現在) においてはおおよそ週に 2 〜 3 回程度ジムに行き筋力トレーニングと有酸素運動を行っている。
2023 年の夏において、体重は 1 年前と比較し +5kg 程度増加し、体脂肪は 13 %程度を推移している。</p>
<h1 id="トレーニングによる変化">トレーニングによる変化</h1>
<p>トレーニングを始めてから得られたメリットとしては下記がある。</p>
<ul>
<li>食事が美味しいこと。</li>
<li>体力が増進したこと。</li>
<li>精神面での安定性が増したこと。</li>
</ul>
<p>これらについてはまた別の機会に詳しく述べられればと思うが、健康面では期待以上の成果があったように思う。
デメリットとしては、筋肥大の影響で以前着ていた服がややきつくなったことくらいかと思う。
特に太ももの周囲が大きくなったことにより、ズボンがきつくなった。</p>
<h1 id="アンチドーピングについて">アンチ・ドーピングについて</h1>
<p>前述の通り、自分は健康の増進のために有酸素運動や筋力トレーニングを始めた。
このため、健康に悪影響が出るような行為は行いたくないと考えている。
健康への考え方は十人十色あり、すべての健康への悪影響を考慮することは難しいと思うが、
自分は一つの尺度として、<a href="https://www.playtruejapan.org/">WADA (JADA)</a>
が定めるアンチ・ドーピングの基準に準拠する方針としている。
具体的には食品やサプリメントの成分などについては
<a href="https://www.globaldro.com/home/index">global DRO (https://www.globaldro.com/home/index)</a> で調べ、
禁止薬物に指定されていないことを確認してから摂取するようにしている。
この基準に従うことで、ある程度の一般性を保った情報 (体験談) を提供できると考えている。</p>
<p>フィットネスに関連する一部の業界においては、禁止薬物の使用が前提になっている雰囲気がある。
このため、アンチ・ドーピングの方針を取っていることを明確に意思表示をすることは有意義であると考えている。</p>]]></summary>
</entry>
<entry>
    <title>AWS の機能を GCP のサービスアカウントで認証して利用する</title>
    <link href="https://blog.monophile.net/posts/20210516_aws_web_identity_federation_google.html" />
    <id>https://blog.monophile.net/posts/20210516_aws_web_identity_federation_google.html</id>
    <published>2021-05-16T00:00:00Z</published>
    <updated>2021-05-16T00:00:00Z</updated>
    <summary type="html"><![CDATA[<h1 id="概要">概要</h1>
<p>Google Cloud (GCP) のサービスアカウントのトークンを用いて認証し、AWS の機能を利用してみた。</p>
<h1 id="背景">背景</h1>
<p>AWS を AWS の外から利用するには、IAM User とそれに付随するアクセスキーを発行して認証することが
簡単かと思われる。しかしながら、アクセスキーは長期的な認証情報のため、
セキュリティ面でのリスクが高く、なるべく用いることは避けたい。</p>
<p>今回、GCP のサービスアカウントを経由して認証することを試みた。
この方式であれば、GCP 内のメタデータサーバからの一時的なトークンによる認証、
もしくは個人の Google アカウントによる認証を用いることができる。
これによって、アクセスキーを用いる必要がなくなり、セキュリティリスク (e.g. クレデンシャルの漏洩)
や運用コスト (e.g. 鍵のローテーション) を低減することできる。</p>
<h1 id="目標">目標</h1>
<p>今回は個人に紐づく Google アカウント から Google のサービスアカウント
(以下、GSA とする) の一時トークンを生成し、AWS のトークンを取得し、
<code>aws</code> コマンドを実行する、ということを試みる。</p>
<h1 id="google-サービスアカウントgsaの準備">Google サービスアカウント(GSA)の準備</h1>
<h2 id="gsa-aws-user-を作成する">GSA aws-user を作成する</h2>
<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="ex">gcloud</span> iam service-accounts create aws-user</span></code></pre></div>
<div class="sourceCode" id="cb2"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="ex">gcloud</span> iam service-accounts describe aws-user@{{ google_project_id }}.iam.gserviceaccount.com <span class="at">--format</span><span class="op">=</span>json</span></code></pre></div>
<div class="sourceCode" id="cb3"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>  <span class="dt">&quot;email&quot;</span><span class="fu">:</span> <span class="st">&quot;aws-user@{{ google_project_id }}.iam.gserviceaccount.com&quot;</span><span class="fu">,</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>  <span class="dt">&quot;etag&quot;</span><span class="fu">:</span> <span class="st">&quot;{{ etag }}&quot;</span><span class="fu">,</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a>  <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;projects/{{ google_project_id }}/serviceAccounts/aws-user@{{ google_project_id }}.iam.gserviceaccount.com&quot;</span><span class="fu">,</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a>  <span class="dt">&quot;oauth2ClientId&quot;</span><span class="fu">:</span> <span class="st">&quot;{{ aws-user_client_id }}&quot;</span><span class="fu">,</span></span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a>  <span class="dt">&quot;projectId&quot;</span><span class="fu">:</span> <span class="st">&quot;{{ project_id }}&quot;</span><span class="fu">,</span></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a>  <span class="dt">&quot;uniqueId&quot;</span><span class="fu">:</span> <span class="st">&quot;{{ gsa_unique_id }}&quot;</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div>
<h2 id="gsa-に対して-iam.serviceaccountstokencreator-のロールを-google-アカウントに付与する">GSA に対して iam.serviceAccountsTokenCreator のロールを Google アカウントに付与する</h2>
<div class="sourceCode" id="cb4"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="ex">gcloud</span> iam service-accounts add-iam-policy-binding <span class="dt">\</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a>  aws-user@{{ google_project_id }}.iam.gserviceaccount.com <span class="dt">\</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a>  <span class="at">--member</span><span class="op">=</span>user:{{ google_account_id }} <span class="dt">\</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a>  <span class="at">--role</span><span class="op">=</span>roles/iam.serviceAccountTokenCreator</span></code></pre></div>
<h1 id="aws-web-identity-federation-の設定を行う">AWS Web Identity Federation の設定を行う</h1>
<h2 id="oidc-プロバイダ-accounts.google.com-の-jwks-配信サーバのtls証明書の-fingerprint-を取得する">OIDC プロバイダ accounts.google.com の jwks 配信サーバのTLS証明書の fingerprint を取得する</h2>
<p><a href="https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html" class="uri">https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html</a></p>
<p>下記の内容は上記の AWS ドキュメントに記載されている内容である。</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> https://accounts.google.com/.well-known/openid-configuration <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .jwks_uri</span></code></pre></div>
<p>↑のようにして account.google.com の jwks 配信サーバの URL ↓を取得する。</p>
<pre class="plain"><code>https://www.googleapis.com/oauth2/v3/certs</code></pre>
<p>エンドポイントは https://www.googleapis.com であることがわかったので、
このhttpsサーバで用いられている証明書の fingerprint を確認する。</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="ex">openssl</span> s_client <span class="at">-showcerts</span> <span class="at">-servername</span> www.googleapis.com <span class="at">-connect</span> www.googleapis.com:443 <span class="op">&lt;</span> /dev/null</span></code></pre></div>
<p>↑を実行すると↓のような文字列が確認できるが、www.googleapis.com は中間認証局
<code>GTS CA 1O1</code> とルート認証局 <code>GlobalSign</code> によって署名されていることがわかる。</p>
<pre class="plain"><code>depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = upload.video.google.com
verify return:1</code></pre>
<p><a href="https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html" class="uri">https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html</a></p>
<blockquote>
<p>複数の証明書が表示される場合は、表示される最後 (コマンド出力の最後) の証明書を見つけます。</p>
</blockquote>
<p>今回は中間認証局 <code>GTS CA 1O1</code> の証明書が最後に出力されていることから、
中間認証局 <code>GTS CA 1O1</code> の証明書の fingerprint を AWS 側に登録する。</p>
<p><strong>depth=0</strong></p>
<pre class="plain"><code>-----BEGIN CERTIFICATE-----
MIIGVDCCBTygAwIBAgIRAMOFqvhu2qDOBQAAAACHvBYwDQYJKoZIhvcNAQELBQAw
QjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFUdvb2dsZSBUcnVzdCBTZXJ2aWNlczET
MBEGA1UEAxMKR1RTIENBIDFPMTAeFw0yMTA0MTMxMDE2MDdaFw0yMTA3MDYxMDE2
MDZaMHExCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgTExDMSAwHgYDVQQDExd1
cGxvYWQudmlkZW8uZ29vZ2xlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
BGMcGq3tTfwQRLn3HLmu9swf8XqLf3FfG0TbAGeXdssiOuN8nPkK5Ori+fYemhjq
EyEH2Xn27KZKMc7Tz06TDqCjggPfMIID2zAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0l
BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUNyC3kUnyEuo2
WGSsJ1FQ5Yf12FUwHwYDVR0jBBgwFoAUmNH4bhDrz5vsYJ8YkBug630J/SswaAYI
KwYBBQUHAQEEXDBaMCsGCCsGAQUFBzABhh9odHRwOi8vb2NzcC5wa2kuZ29vZy9n
dHMxbzFjb3JlMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2cvZ3NyMi9HVFMx
TzEuY3J0MIIBmAYDVR0RBIIBjzCCAYuCF3VwbG9hZC52aWRlby5nb29nbGUuY29t
ghQqLmNsaWVudHMuZ29vZ2xlLmNvbYIRKi5kb2NzLmdvb2dsZS5jb22CEiouZHJp
dmUuZ29vZ2xlLmNvbYITKi5nZGF0YS55b3V0dWJlLmNvbYIQKi5nb29nbGVhcGlz
LmNvbYITKi5waG90b3MuZ29vZ2xlLmNvbYITKi51cGxvYWQuZ29vZ2xlLmNvbYIU
Ki51cGxvYWQueW91dHViZS5jb22CFyoueW91dHViZS0zcmQtcGFydHkuY29tghti
Zy1jYWxsLWRvbmF0aW9uLWFscGhhLmdvb2eCHGJnLWNhbGwtZG9uYXRpb24tY2Fu
YXJ5Lmdvb2eCGWJnLWNhbGwtZG9uYXRpb24tZGV2Lmdvb2eCFWJnLWNhbGwtZG9u
YXRpb24uZ29vZ4IRdXBsb2FkLmdvb2dsZS5jb22CEnVwbG9hZC55b3V0dWJlLmNv
bYIfdXBsb2Fkcy5zdGFnZS5nZGF0YS55b3V0dWJlLmNvbTAhBgNVHSAEGjAYMAgG
BmeBDAECAjAMBgorBgEEAdZ5AgUDMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9j
cmwucGtpLmdvb2cvR1RTMU8xY29yZS5jcmwwggEGBgorBgEEAdZ5AgQCBIH3BIH0
APIAdwD2XJQv0XcwIhRUGAgwlFaO400TGTO/3wwvIAvMTvFk4wAAAXjK8hsOAAAE
AwBIMEYCIQCavqW8CdwK7hXvDYsaAorTCQqKYz26MfnyMXv8q2WfQQIhAOH2M4fa
VTz4yOUQ86RdmRIRaLCKTCvHcJ74ufdC264BAHcARJRlLrDuzq/EQAfYqP4owNrm
gr7YyzG1P9MzlrW2gagAAAF4yvIbSAAABAMASDBGAiEA5AuJL4jq01XnkwWUa4v+
eTkZDcsn9fRGRwPp/2+N+2ECIQDI8SEiaM1lwEAMvEjCudSVhhAsspRsZsf8wKOI
Geh68DANBgkqhkiG9w0BAQsFAAOCAQEAarNIFB1qGp3V96Y7oVADfwhPEGXCszY4
TkhJ9sNb2LWi1o0LzZMR9a/rfyfb8Q6eaP0+2ObY8xlQLNXrXJ+eOXnwTxqq99tT
9/7mEXXr72Fyaag8/uQTm3cNJGPX+XabQRt7r3VzgMtVowWdxcNFoCWTDQUXkloP
Bbap0YsrJy4wcAQqKUihjVVxez0oT5HejbhNamjUMYccQj3MO5akFW5/v8RNBKWM
nWAX5pxKf1qH8nwo6q/2lFKny879Lvv1Knru0P3XI9X+bnuTFxQuANVVf5AiEEJx
H8DdtkxrjS5u5vpSeciULGmfoGkS6weamvG75a/2Xi3kYYpOh68dAg==
-----END CERTIFICATE-----</code></pre>
<p><strong>depth=1</strong></p>
<pre class="plain"><code>-----BEGIN CERTIFICATE-----
MIIESjCCAzKgAwIBAgINAeO0mqGNiqmBJWlQuDANBgkqhkiG9w0BAQsFADBMMSAw
HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs
U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy
MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg
U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxTzEwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDQGM9F1IvN05zkQO9+tN1pIRvJzzyOTHW5DzEZhD2ePCnv
UA0Qk28FgICfKqC9EksC4T2fWBYk/jCfC3R3VZMdS/dN4ZKCEPZRrAzDsiKUDzRr
mBBJ5wudgzndIMYcLe/RGGFl5yODIKgjEv/SJH/UL+dEaltN11BmsK+eQmMF++Ac
xGNhr59qM/9il71I2dN8FGfcddwuaej4bXhp0LcQBbjxMcI7JP0aM3T4I+DsaxmK
FsbjzaTNC9uzpFlgOIg7rR25xoynUxv8vNmkq7zdPGHXkxWY7oG9j+JkRyBABk7X
rJfoucBZEqFJJSPk7XA0LKW0Y3z5oz2D0c1tJKwHAgMBAAGjggEzMIIBLzAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud
EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJjR+G4Q68+b7GCfGJAboOt9Cf0rMB8G
A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl
BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp
MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g
BDgwNjA0BgZngQwBAgIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y
ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAGoA+Nnn78y6pRjd9XlQWNa7H
TgiZ/r3RNGkmUmYHPQq6Scti9PEajvwRT2iWTHQr02fesqOqBY2ETUwgZQ+lltoN
FvhsO9tvBCOIazpswWC9aJ9xju4tWDQH8NVU6YZZ/XteDSGU9YzJqPjY8q3MDxrz
mqepBCf5o8mw/wJ4a2G6xzUr6Fb6T8McDO22PLRL6u3M4Tzs3A2M1j6bykJYi8wW
IRdAvKLWZu/axBVbzYmqmwkm5zLSDW5nIAJbELCQCZwMH56t2Dvqofxs6BBcCFIZ
USpxu6x6td0V7SvJCCosirSmIatj/9dSSVDQibet8q/7UK4v4ZUN80atnZz1yg==
-----END CERTIFICATE-----</code></pre>
<p>中間認証局の証明書を <code>/tmp/depth_1.pem</code> として保存する。</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="ex">openssl</span> x509 <span class="at">-fingerprint</span> <span class="op">&lt;</span> /tmp/depth_1.pem</span></code></pre></div>
<p>↑の <code>openssl</code> コマンドで fingerprint ↓を得る。</p>
<pre class="plain"><code>SHA1 Fingerprint=DF:E2:07:0C:79:E7:FF:36:A9:25:FF:A3:27:FF:E3:DE:EC:F8:F9:C2</code></pre>
<div class="sourceCode" id="cb13"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> DF:E2:07:0C:79:E7:FF:36:A9:25:FF:A3:27:FF:E3:DE:EC:F8:F9:C2 <span class="kw">|</span> <span class="fu">tr</span> <span class="at">-d</span> <span class="st">&quot;:&quot;</span> <span class="kw">|</span> <span class="fu">tr</span> <span class="st">&quot;[[:upper:]]&quot;</span> <span class="st">&quot;[[:lower:]]&quot;</span></span></code></pre></div>
<p>実際に利用する値はコロンを除いた小文字になるため、↑で加工した値 ↓ を利用する。</p>
<pre class="plain"><code>dfe2070c79e7ff36a925ffa327ffe3deecf8f9c2</code></pre>
<h2 id="oidc-プロバイダ-accounts.google.com-の作成">OIDC プロバイダ accounts.google.com の作成</h2>
<p>前項で得た fingerprint を用いて OIDC プロバイダ accounts.google.com を作成する。</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true" tabindex="-1"></a><span class="ex">aws</span> iam create-open-id-connect-provider <span class="dt">\</span></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true" tabindex="-1"></a>  <span class="at">--url</span> https://accounts.google.com <span class="dt">\</span></span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true" tabindex="-1"></a>  <span class="at">--thumbprint-list</span> dfe2070c79e7ff36a925ffa327ffe3deecf8f9c2</span></code></pre></div>
<h2 id="サービスアカウントのuniqueidをidentity-proversのaudienceに追加する">サービスアカウントのUniqueIDをIdentity Proversのaudienceに追加する</h2>
<div class="sourceCode" id="cb16"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="ex">aws</span> iam add-client-id-to-open-id-connect-provider <span class="dt">\</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a>  <span class="at">--open-id-connect-provider-arn</span> <span class="st">&quot;arn:aws:iam::{{ aws_account_id }}:oidc-provider/accounts.google.com&quot;</span> <span class="dt">\</span></span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true" tabindex="-1"></a>  <span class="at">--client-id</span> {{ gsa_unique_id }}</span></code></pre></div>
<h2 id="assumeroleするためのiam-ロールを作成する">AssumeRoleするためのIAM ロールを作成する</h2>
<p><strong>gsa-aws-user.json</strong></p>
<div class="sourceCode" id="cb17"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true" tabindex="-1"></a>    <span class="dt">&quot;Version&quot;</span><span class="fu">:</span> <span class="st">&quot;2012-10-17&quot;</span><span class="fu">,</span></span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true" tabindex="-1"></a>    <span class="dt">&quot;Statement&quot;</span><span class="fu">:</span> <span class="ot">[</span></span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true" tabindex="-1"></a>        <span class="fu">{</span></span>
<span id="cb17-5"><a href="#cb17-5" aria-hidden="true" tabindex="-1"></a>            <span class="dt">&quot;Effect&quot;</span><span class="fu">:</span> <span class="st">&quot;Allow&quot;</span><span class="fu">,</span></span>
<span id="cb17-6"><a href="#cb17-6" aria-hidden="true" tabindex="-1"></a>            <span class="dt">&quot;Principal&quot;</span><span class="fu">:</span> <span class="fu">{</span></span>
<span id="cb17-7"><a href="#cb17-7" aria-hidden="true" tabindex="-1"></a>                <span class="dt">&quot;Federated&quot;</span><span class="fu">:</span> <span class="st">&quot;arn:aws:iam::{{ aws_account_id }}:oidc-provider/accounts.google.com&quot;</span></span>
<span id="cb17-8"><a href="#cb17-8" aria-hidden="true" tabindex="-1"></a>            <span class="fu">},</span></span>
<span id="cb17-9"><a href="#cb17-9" aria-hidden="true" tabindex="-1"></a>            <span class="dt">&quot;Action&quot;</span><span class="fu">:</span> <span class="st">&quot;sts:AssumeRoleWithWebIdentity&quot;</span><span class="fu">,</span></span>
<span id="cb17-10"><a href="#cb17-10" aria-hidden="true" tabindex="-1"></a>            <span class="dt">&quot;Condition&quot;</span><span class="fu">:</span> <span class="fu">{</span></span>
<span id="cb17-11"><a href="#cb17-11" aria-hidden="true" tabindex="-1"></a>                <span class="dt">&quot;StringEquals&quot;</span><span class="fu">:</span> <span class="fu">{</span></span>
<span id="cb17-12"><a href="#cb17-12" aria-hidden="true" tabindex="-1"></a>                    <span class="dt">&quot;accounts.google.com:aud&quot;</span><span class="fu">:</span> <span class="st">&quot;{{ gsa_unique_id }}&quot;</span><span class="fu">,</span></span>
<span id="cb17-13"><a href="#cb17-13" aria-hidden="true" tabindex="-1"></a>                    <span class="dt">&quot;accounts.google.com:sub&quot;</span><span class="fu">:</span> <span class="st">&quot;{{ gsa_unique_id }}&quot;</span><span class="fu">,</span></span>
<span id="cb17-14"><a href="#cb17-14" aria-hidden="true" tabindex="-1"></a>                    <span class="dt">&quot;accounts.google.com:oaud&quot;</span><span class="fu">:</span> <span class="st">&quot;arn:aws:iam::{{ aws_account_id }}:oidc-provider/accounts.google.com&quot;</span><span class="fu">,</span></span>
<span id="cb17-15"><a href="#cb17-15" aria-hidden="true" tabindex="-1"></a>                    <span class="dt">&quot;accounts.google.com:email&quot;</span><span class="fu">:</span> <span class="st">&quot;aws-user@{{ google_project_id }}.iam.gserviceaccount.com&quot;</span></span>
<span id="cb17-16"><a href="#cb17-16" aria-hidden="true" tabindex="-1"></a>                <span class="fu">}</span></span>
<span id="cb17-17"><a href="#cb17-17" aria-hidden="true" tabindex="-1"></a>            <span class="fu">}</span></span>
<span id="cb17-18"><a href="#cb17-18" aria-hidden="true" tabindex="-1"></a>        <span class="fu">}</span></span>
<span id="cb17-19"><a href="#cb17-19" aria-hidden="true" tabindex="-1"></a>    <span class="ot">]</span></span>
<span id="cb17-20"><a href="#cb17-20" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div>
<div class="sourceCode" id="cb18"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true" tabindex="-1"></a><span class="ex">aws</span> iam create-role <span class="at">--role-name</span> gsa-aws-user <span class="at">--assume-role-policy-document</span> file://gsa-aws-user.json</span></code></pre></div>
<h1 id="gsaのトークンを用いてawsコマンドを実行できるようにする">GSAのトークンを用いてawsコマンドを実行できるようにする</h1>
<p><a href="https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sourcing-external.html" class="uri">https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sourcing-external.html</a></p>
<p><code>~/.aws/config</code> の <code>credential_process</code> という仕組みを用い、
GSA のトークンからAWSの認証情報を作成するための設定を行う。</p>
<h2 id="gsa-oidc.sh-を配置する">gsa-oidc.sh を配置する</h2>
<p>下記の <code>gsa-oidc.sh</code> を PATH が通っている場所に配置する。</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/bin/bash</span></span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a><span class="bu">set</span> <span class="at">-eu</span> <span class="at">-o</span> pipefail</span>
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true" tabindex="-1"></a><span class="co"># ${1}:</span></span>
<span id="cb19-4"><a href="#cb19-4" aria-hidden="true" tabindex="-1"></a><span class="co">#   gcloud configuration name.</span></span>
<span id="cb19-5"><a href="#cb19-5" aria-hidden="true" tabindex="-1"></a><span class="co">#   (if you want to use current configuration, set empty &quot;&quot; string.)</span></span>
<span id="cb19-6"><a href="#cb19-6" aria-hidden="true" tabindex="-1"></a><span class="co"># ${2}:</span></span>
<span id="cb19-7"><a href="#cb19-7" aria-hidden="true" tabindex="-1"></a><span class="co">#   Google Cloud service account&#39;s email.</span></span>
<span id="cb19-8"><a href="#cb19-8" aria-hidden="true" tabindex="-1"></a><span class="co"># ${3}:</span></span>
<span id="cb19-9"><a href="#cb19-9" aria-hidden="true" tabindex="-1"></a><span class="co">#   AWS account id.</span></span>
<span id="cb19-10"><a href="#cb19-10" aria-hidden="true" tabindex="-1"></a><span class="co"># ${4}:</span></span>
<span id="cb19-11"><a href="#cb19-11" aria-hidden="true" tabindex="-1"></a><span class="co">#   AWS role name.</span></span>
<span id="cb19-12"><a href="#cb19-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb19-13"><a href="#cb19-13" aria-hidden="true" tabindex="-1"></a><span class="va">GCLOUD_CONFIGURATION</span><span class="op">=</span><span class="va">${1}</span></span>
<span id="cb19-14"><a href="#cb19-14" aria-hidden="true" tabindex="-1"></a><span class="va">GSA_EMAIL</span><span class="op">=</span><span class="va">${2}</span></span>
<span id="cb19-15"><a href="#cb19-15" aria-hidden="true" tabindex="-1"></a><span class="va">AWS_ACCOUNT</span><span class="op">=</span><span class="va">${3}</span></span>
<span id="cb19-16"><a href="#cb19-16" aria-hidden="true" tabindex="-1"></a><span class="va">AWS_ROLE_NAME</span><span class="op">=</span><span class="va">${4}</span></span>
<span id="cb19-17"><a href="#cb19-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb19-18"><a href="#cb19-18" aria-hidden="true" tabindex="-1"></a><span class="va">GCLOUD</span><span class="op">=</span><span class="st">&quot;gcloud --configuration=</span><span class="va">${GCLOUD_CONFIGURATION}</span><span class="st">&quot;</span></span>
<span id="cb19-19"><a href="#cb19-19" aria-hidden="true" tabindex="-1"></a><span class="va">GCLOUD_ACCOUNT</span><span class="op">=</span><span class="va">$(${GCLOUD}</span> config get-value account<span class="va">)</span></span>
<span id="cb19-20"><a href="#cb19-20" aria-hidden="true" tabindex="-1"></a><span class="va">AUDIENCE</span><span class="op">=</span><span class="st">&quot;arn:aws:iam::</span><span class="va">${AWS_ACCOUNT}</span><span class="st">:oidc-provider/accounts.google.com&quot;</span></span>
<span id="cb19-21"><a href="#cb19-21" aria-hidden="true" tabindex="-1"></a><span class="va">GSA_ID_TOKEN</span><span class="op">=</span><span class="va">$(${GCLOUD}</span> <span class="at">--impersonate-service-account</span><span class="op">=</span><span class="va">${GSA_EMAIL}</span> auth print-identity-token <span class="at">--audiences</span><span class="op">=</span><span class="va">${AUDIENCE}</span> <span class="at">--include-email</span><span class="va">)</span></span>
<span id="cb19-22"><a href="#cb19-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb19-23"><a href="#cb19-23" aria-hidden="true" tabindex="-1"></a><span class="va">AWS_ROLE_ARN</span><span class="op">=</span><span class="st">&quot;arn:aws:iam::</span><span class="va">${AWS_ACCOUNT}</span><span class="st">:role/</span><span class="va">${AWS_ROLE_NAME}</span><span class="st">&quot;</span></span>
<span id="cb19-24"><a href="#cb19-24" aria-hidden="true" tabindex="-1"></a><span class="va">AWS_ROLE_SESSION_NAME</span><span class="op">=</span><span class="st">&quot;gsa-oidc-</span><span class="va">${GCLOUD_ACCOUNT}</span><span class="st">&quot;</span></span>
<span id="cb19-25"><a href="#cb19-25" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb19-26"><a href="#cb19-26" aria-hidden="true" tabindex="-1"></a><span class="ex">aws</span> <span class="at">--profile</span> gsa-oidc sts assume-role-with-web-identity <span class="dt">\</span></span>
<span id="cb19-27"><a href="#cb19-27" aria-hidden="true" tabindex="-1"></a>  <span class="at">--role-arn</span> <span class="st">&quot;</span><span class="va">${AWS_ROLE_ARN}</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb19-28"><a href="#cb19-28" aria-hidden="true" tabindex="-1"></a>  <span class="at">--role-session-name</span> <span class="st">&quot;</span><span class="va">${AWS_ROLE_SESSION_NAME}</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb19-29"><a href="#cb19-29" aria-hidden="true" tabindex="-1"></a>  <span class="at">--web-identity-token</span> <span class="st">&quot;</span><span class="va">${GSA_ID_TOKEN}</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb19-30"><a href="#cb19-30" aria-hidden="true" tabindex="-1"></a>  <span class="kw">|</span> <span class="ex">jq</span> <span class="st">&quot;{Version: 1} + .Credentials&quot;</span></span></code></pre></div>
<p>実行権限を付与しておく。</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true" tabindex="-1"></a><span class="fu">chmod</span> a+x gsa-oidc.sh</span></code></pre></div>
<h2 id="aws-user-という名前で-gcloud-の-configuration-を作成する">aws-user という名前で gcloud の configuration を作成する</h2>
<div class="sourceCode" id="cb21"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true" tabindex="-1"></a><span class="ex">gcloud</span> config configurations create aws-user</span>
<span id="cb21-2"><a href="#cb21-2" aria-hidden="true" tabindex="-1"></a><span class="ex">gcloud</span> config set project {{ google_project_id }}</span>
<span id="cb21-3"><a href="#cb21-3" aria-hidden="true" tabindex="-1"></a><span class="ex">gcloud</span> auth login {{ google_account_email }}</span></code></pre></div>
<h2 id="awsconfig-で-gsa-oidc.sh-を用いて認証情報を得る設定をする">~/.aws/config で gsa-oidc.sh を用いて認証情報を得る設定をする</h2>
<pre class="plain"><code>[profile gsa-oidc]
output = json

[profile gsa-aws-user]
credential_process = gsa-oidc.sh aws-user aws-user@{{ google_project_id }}.iam.gserviceaccount.com {{ aws_account_id }} gsa-aws-user</code></pre>
<h2 id="実行する">実行する</h2>
<div class="sourceCode" id="cb23"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb23-1"><a href="#cb23-1" aria-hidden="true" tabindex="-1"></a><span class="ex">aws</span> <span class="at">--profile</span> gsa-aws-user sts get-caller-identity <span class="kw">|</span> <span class="ex">jq</span> <span class="at">-r</span> .Arn</span></code></pre></div>
<p>↑を実行すると↓のような出力を得られる。</p>
<div class="sourceCode" id="cb24"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="ex">arn:aws:sts::{{</span> aws_account_id }}:assumed-role/gsa-aws-user/gsa-oidc-{{ google_account_email }}</span></code></pre></div>
<p>これで AssumeRole を GSA の認証情報を用いて行えることがわかった。</p>
<p>あとはロール aws-user に適切なポリシーを付与すれば、各種 AWS の機能を使えるようになる。</p>
<h1 id="補足">補足</h1>
<p>中間認証局 <code>GTS CA 1O1</code> の証明書の情報を確認する。</p>
<div class="sourceCode" id="cb25"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a><span class="ex">openssl</span> x509 <span class="at">-text</span> <span class="op">&lt;&lt;_EOS_</span></span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a><span class="st">-----BEGIN CERTIFICATE-----</span></span>
<span id="cb25-3"><a href="#cb25-3" aria-hidden="true" tabindex="-1"></a><span class="st">MIIESjCCAzKgAwIBAgINAeO0mqGNiqmBJWlQuDANBgkqhkiG9w0BAQsFADBMMSAw</span></span>
<span id="cb25-4"><a href="#cb25-4" aria-hidden="true" tabindex="-1"></a><span class="st">HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs</span></span>
<span id="cb25-5"><a href="#cb25-5" aria-hidden="true" tabindex="-1"></a><span class="st">U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy</span></span>
<span id="cb25-6"><a href="#cb25-6" aria-hidden="true" tabindex="-1"></a><span class="st">MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg</span></span>
<span id="cb25-7"><a href="#cb25-7" aria-hidden="true" tabindex="-1"></a><span class="st">U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxTzEwggEiMA0GCSqGSIb3DQEBAQUA</span></span>
<span id="cb25-8"><a href="#cb25-8" aria-hidden="true" tabindex="-1"></a><span class="st">A4IBDwAwggEKAoIBAQDQGM9F1IvN05zkQO9+tN1pIRvJzzyOTHW5DzEZhD2ePCnv</span></span>
<span id="cb25-9"><a href="#cb25-9" aria-hidden="true" tabindex="-1"></a><span class="st">UA0Qk28FgICfKqC9EksC4T2fWBYk/jCfC3R3VZMdS/dN4ZKCEPZRrAzDsiKUDzRr</span></span>
<span id="cb25-10"><a href="#cb25-10" aria-hidden="true" tabindex="-1"></a><span class="st">mBBJ5wudgzndIMYcLe/RGGFl5yODIKgjEv/SJH/UL+dEaltN11BmsK+eQmMF++Ac</span></span>
<span id="cb25-11"><a href="#cb25-11" aria-hidden="true" tabindex="-1"></a><span class="st">xGNhr59qM/9il71I2dN8FGfcddwuaej4bXhp0LcQBbjxMcI7JP0aM3T4I+DsaxmK</span></span>
<span id="cb25-12"><a href="#cb25-12" aria-hidden="true" tabindex="-1"></a><span class="st">FsbjzaTNC9uzpFlgOIg7rR25xoynUxv8vNmkq7zdPGHXkxWY7oG9j+JkRyBABk7X</span></span>
<span id="cb25-13"><a href="#cb25-13" aria-hidden="true" tabindex="-1"></a><span class="st">rJfoucBZEqFJJSPk7XA0LKW0Y3z5oz2D0c1tJKwHAgMBAAGjggEzMIIBLzAOBgNV</span></span>
<span id="cb25-14"><a href="#cb25-14" aria-hidden="true" tabindex="-1"></a><span class="st">HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud</span></span>
<span id="cb25-15"><a href="#cb25-15" aria-hidden="true" tabindex="-1"></a><span class="st">EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJjR+G4Q68+b7GCfGJAboOt9Cf0rMB8G</span></span>
<span id="cb25-16"><a href="#cb25-16" aria-hidden="true" tabindex="-1"></a><span class="st">A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl</span></span>
<span id="cb25-17"><a href="#cb25-17" aria-hidden="true" tabindex="-1"></a><span class="st">BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp</span></span>
<span id="cb25-18"><a href="#cb25-18" aria-hidden="true" tabindex="-1"></a><span class="st">MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g</span></span>
<span id="cb25-19"><a href="#cb25-19" aria-hidden="true" tabindex="-1"></a><span class="st">BDgwNjA0BgZngQwBAgIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y</span></span>
<span id="cb25-20"><a href="#cb25-20" aria-hidden="true" tabindex="-1"></a><span class="st">ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAGoA+Nnn78y6pRjd9XlQWNa7H</span></span>
<span id="cb25-21"><a href="#cb25-21" aria-hidden="true" tabindex="-1"></a><span class="st">TgiZ/r3RNGkmUmYHPQq6Scti9PEajvwRT2iWTHQr02fesqOqBY2ETUwgZQ+lltoN</span></span>
<span id="cb25-22"><a href="#cb25-22" aria-hidden="true" tabindex="-1"></a><span class="st">FvhsO9tvBCOIazpswWC9aJ9xju4tWDQH8NVU6YZZ/XteDSGU9YzJqPjY8q3MDxrz</span></span>
<span id="cb25-23"><a href="#cb25-23" aria-hidden="true" tabindex="-1"></a><span class="st">mqepBCf5o8mw/wJ4a2G6xzUr6Fb6T8McDO22PLRL6u3M4Tzs3A2M1j6bykJYi8wW</span></span>
<span id="cb25-24"><a href="#cb25-24" aria-hidden="true" tabindex="-1"></a><span class="st">IRdAvKLWZu/axBVbzYmqmwkm5zLSDW5nIAJbELCQCZwMH56t2Dvqofxs6BBcCFIZ</span></span>
<span id="cb25-25"><a href="#cb25-25" aria-hidden="true" tabindex="-1"></a><span class="st">USpxu6x6td0V7SvJCCosirSmIatj/9dSSVDQibet8q/7UK4v4ZUN80atnZz1yg==</span></span>
<span id="cb25-26"><a href="#cb25-26" aria-hidden="true" tabindex="-1"></a><span class="st">-----END CERTIFICATE-----</span></span>
<span id="cb25-27"><a href="#cb25-27" aria-hidden="true" tabindex="-1"></a><span class="op">_EOS_</span></span></code></pre></div>
<p>↑を行うと↓のような出力を得られる。</p>
<pre class="plain"><code>  :
Validity
    Not Before: Jun 15 00:00:42 2017 GMT
    Not After : Dec 15 00:00:42 2021 GMT
  :</code></pre>
<p>中間認証局の証明書が 2021/12/15 に失効するため、
中間認証局の証明書の fingerprint を更新する仕組みが必要になる。</p>
<h1 id="参考url">参考URL</h1>
<ul>
<li><a href="https://pki.goog/repository/" class="uri">https://pki.goog/repository/</a></li>
<li><a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html" class="uri">https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html</a></li>
</ul>]]></summary>
</entry>
<entry>
    <title>二次形式の平方完成</title>
    <link href="https://blog.monophile.net/posts/20131227_quadratic_square.html" />
    <id>https://blog.monophile.net/posts/20131227_quadratic_square.html</id>
    <published>2013-12-27T00:00:00Z</published>
    <updated>2013-12-27T00:00:00Z</updated>
    <summary type="html"><![CDATA[<h1 id="概要">概要</h1>
<p>強凸二次形式の最小元と最小値を求めるために、二次形式の平方完成をしました。</p>
<h1 id="平方完成正則の場合">平方完成(正則の場合)</h1>
<p>まずは元の式と平方完成した後の式を比較します。
<span class="math inline">\(Q\)</span> は対称行列で、 <span class="math inline">\(q\)</span> は一次式の係数ベクトルです。</p>
<p><span class="math display">\[
\begin{align*}
f(x) &amp;=  x^T Q x + q^T x \text{  (二次形式)}\\
&amp;= (x + z)^T Q (x + z) + c \text{  (平方完成後)}\\
&amp;= x^T Q x + 2 z^TQx + z^TQz + c
\end{align*}
\]</span></p>
<p>係数を比較することによって以下の等式が成り立ちます。</p>
<p><span class="math display">\[
\begin{align*}
2 z^TQ      &amp;= q^T \\
z^TQz + c   &amp;= 0
\end{align*}
\]</span></p>
<p><span class="math inline">\(|Q| \neq 0\)</span> (逆行列が存在) と仮定すると、 以下のようにzとcが求まります。</p>
<p><span class="math display">\[
\begin{align*}
z &amp;= \frac{1}{2} Q^{-1} q \\
c &amp;= -z^TQz = -\frac{1}{4} q^T Q^{-1} q
\end{align*}
\]</span></p>
<p><span class="math inline">\(Q \succ 0\)</span> の場合、最小元と最小値は以下のように表されます。</p>
<p><span class="math display">\[\begin{align*}
\text{(最小元) } &amp;= -z = -\frac{1}{2} Q^{-1} q \\
\text{(最小値) } &amp;= c  = -z^TQz = -\frac{1}{4} q^T Q^{-1} q
\end{align*}\]</span></p>]]></summary>
</entry>

</feed>
