<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://codedchords.dev/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;codedchords.dev</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It&#x27;s free.</tabi:about_feeds>
        <tabi:visit_the_site>Visit website</tabi:visit_the_site>
        <tabi:recent_posts>Recent posts</tabi:recent_posts>
        <tabi:last_updated_on>Updated on $DATE</tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>Node</tabi:current_section>
    </tabi:metadata><title>Coded Chords - Node</title>
        <subtitle>A personal blog</subtitle>
    <link href="https://codedchords.dev/tags/node/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://codedchords.dev/tags/node/" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2025-12-06T00:00:00+00:00</updated><id>https://codedchords.dev/tags/node/atom.xml</id><entry xml:lang="en">
        <title>React Server Components RCE脆弱性（CVE-2025-55182）への対応記録</title>
        <published>2025-12-06T00:00:00+00:00</published>
        <updated>2025-12-06T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/react-nextjs-cve-2025-55182-response/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/react-nextjs-cve-2025-55182-response/</id>
        
            <content type="html">&lt;h2 id=&quot;脆弱性の概要&quot;&gt;脆弱性の概要&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;CVE-2025-55182とは&quot;&gt;CVE-2025-55182とは&lt;&#x2F;h3&gt;
&lt;p&gt;CVE-2025-55182は、React 19のServer Components（RSC）における「Flight」プロトコルの安全でないデシリアライゼーション（deserialize）に起因する脆弱性です。
主な特徴は次の通りです。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVSSスコア: 10.0（最大値）&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;影響範囲: React 19.0.0、19.1.0、19.1.1、19.2.0&lt;&#x2F;li&gt;
&lt;li&gt;攻撃条件: 認証不要、細工されたHTTPリクエストのみで実行可能&lt;&#x2F;li&gt;
&lt;li&gt;デフォルト設定で脆弱: &lt;code&gt;create-next-app&lt;&#x2F;code&gt;により作成した標準的なNext.jsアプリケーションが影響を受ける&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;技術的な仕組み&quot;&gt;技術的な仕組み&lt;&#x2F;h3&gt;
&lt;p&gt;この脆弱性は、RSCの内部通信プロトコルである「Flight」の処理において、攻撃者の制御可能なデータを適切な検証なしにデシリアライズしてしまうことに起因します。攻撃者からペイロードを含むHTTPリクエストが送信されると、サーバー側ではこれをFlightプロトコルのデータとして処理し、検証なしにデシリアライズします。この結果、任意のコードを実行される可能性があります。&lt;&#x2F;p&gt;
&lt;p&gt;重要なのは、この処理がアプリケーションの認証ロジックより前、つまりMiddlewareでの保護より深い層で行われるため、通常の認証機構では防げないという点です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;CVE番号の統合経緯&quot;&gt;CVE番号の統合経緯&lt;&#x2F;h2&gt;
&lt;p&gt;2025年12月3日時点では、以下の2つのCVE番号で追跡されていました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-55182&lt;&#x2F;strong&gt;: React Server Componentsの脆弱性&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-66478&lt;&#x2F;strong&gt;: Next.jsの脆弱性&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;調査の結果、Next.jsの脆弱性は実質的にReactの脆弱性に起因することが判明し、&lt;strong&gt;CVE-2025-66478は重複として却下&lt;&#x2F;strong&gt;されました。現在は&lt;strong&gt;CVE-2025-55182&lt;&#x2F;strong&gt;に統合されています。&lt;&#x2F;p&gt;
&lt;p&gt;この経緯は、脆弱性の根本原因がReactのRSC実装そのものにあり、Next.jsはその影響を受けていたに過ぎないことを示しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;影響を受けるバージョンと修正版&quot;&gt;影響を受けるバージョンと修正版&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;React_&#x2F;_React-dom&quot;&gt;React &#x2F; React-dom&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;影響を受けるバージョン&lt;&#x2F;th&gt;&lt;th&gt;修正済みバージョン&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;19.0.0&lt;&#x2F;td&gt;&lt;td&gt;19.0.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;19.1.0, 19.1.1&lt;&#x2F;td&gt;&lt;td&gt;19.1.2&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;19.2.0&lt;&#x2F;td&gt;&lt;td&gt;19.2.1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;Next.js&quot;&gt;Next.js&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;影響を受けるバージョン&lt;&#x2F;th&gt;&lt;th&gt;修正済みバージョン&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;15.x（全般）&lt;&#x2F;td&gt;&lt;td&gt;15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;16.x（全般）&lt;&#x2F;td&gt;&lt;td&gt;16.0.7&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;14.3.0-canary.77以降&lt;&#x2F;td&gt;&lt;td&gt;（14.x Stable版は影響なし）&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;strong&gt;注&lt;&#x2F;strong&gt;: Next.js 13.x、14.x stable版、Pages Router、Edge Runtimeは影響を受けません。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;実際の攻撃状況&quot;&gt;実際の攻撃状況&lt;&#x2F;h2&gt;
&lt;p&gt;この脆弱性は公表直後から実際に悪用されています。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;2025年12月3日: 脆弱性が公表される&lt;&#x2F;li&gt;
&lt;li&gt;同日中: 中国関連の脅威グループによる大規模な攻撃活動が観測される&lt;&#x2F;li&gt;
&lt;li&gt;2025年12月5日午前6時（UTC）以降: Wizのセンサーが複数の被害者を検知&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;この脆弱性は「React2Shell」または「React4Shell」という名称でも呼ばれ、既に実証コード（PoC）が公開されています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;当ブログでの対応状況&quot;&gt;当ブログでの対応状況&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;対応タイムライン&quot;&gt;対応タイムライン&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2025年12月3日&lt;&#x2F;strong&gt;: CVE-2025-55182が公表される&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;2025年12月5日&lt;&#x2F;strong&gt;: 当ブログで修正版へのアップデート実施（v1.7.1）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;実施した対応&quot;&gt;実施した対応&lt;&#x2F;h3&gt;
&lt;p&gt;以下のパッケージを修正版にアップデートしました。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 実施したアップデート&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;React:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.0.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.2.1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;React-dom:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.0.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 19.2.1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Next.js:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.2.3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.5.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;@next&#x2F;mdx:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.2.3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.5.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;eslint-config-next:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.2.3&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; →&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 15.5.7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;当ブログは&lt;strong&gt;CVE-2025-55182に完全対応済み&lt;&#x2F;strong&gt;であり、この脆弱性の影響を受けない安全な状態です。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;推奨される対応&quot;&gt;推奨される対応&lt;&#x2F;h2&gt;
&lt;p&gt;Next.jsやReactを使用しているプロジェクトをお持ちの方は、以下の対応を推奨します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1._バージョンの確認&quot;&gt;1. バージョンの確認&lt;&#x2F;h3&gt;
&lt;p&gt;まず現在のバージョンを確認します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; list next react react-dom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;2._修正版へのアップデート&quot;&gt;2. 修正版へのアップデート&lt;&#x2F;h3&gt;
&lt;p&gt;該当する場合は、直ちに修正版へアップデートしてください。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# npm の場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install next@latest react@latest react-dom@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# yarn の場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;yarn&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add next@latest react@latest react-dom@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# pnpm の場合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;pnpm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add next@latest react@latest react-dom@latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;3._内部依存関係の確認&quot;&gt;3. 内部依存関係の確認&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;&#x2F;code&gt;だけでなく、ロックファイル（&lt;code&gt;package-lock.json&lt;&#x2F;code&gt;、&lt;code&gt;yarn.lock&lt;&#x2F;code&gt;など）も確認し、内部依存関係として古いバージョンが残っていないか確認することを強く推奨します。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# ロックファイル内のReactバージョンを確認&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -A5 &amp;#39;&amp;quot;react&amp;quot;:&amp;#39; package-lock.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;grep&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-punctuation z-definition z-string&quot;&gt; -A5 &amp;#39;&amp;quot;next&amp;quot;:&amp;#39; package-lock.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;4._デプロイ&quot;&gt;4. デプロイ&lt;&#x2F;h3&gt;
&lt;p&gt;アップデート後は速やかにビルドとデプロイを実施してください。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; run build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# デプロイコマンドを実行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;CVE-2025-55182は、React Server Componentsの根本的な脆弱性であり、
&lt;strong&gt;CVSS 10.0&lt;&#x2F;strong&gt;という最大の深刻度を持つ重大な問題です。デフォルト設定で脆弱であり、認証を回避して攻撃可能という特性から、速やかな対応が必要です。&lt;&#x2F;p&gt;
&lt;p&gt;当ブログでは公表から2日以内に対応を完了しましたが、既に実際の攻撃が観測されているため、まだ対応されていない方は最優先で対応することを強く推奨します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;react.dev&#x2F;blog&#x2F;2025&#x2F;12&#x2F;03&#x2F;critical-security-vulnerability-in-react-server-components&quot;&gt;Critical Security Vulnerability in React Server Components – React&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nextjs.org&#x2F;blog&#x2F;CVE-2025-66478&quot;&gt;Security Advisory: CVE-2025-66478 | Next.js&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.wiz.io&#x2F;blog&#x2F;critical-vulnerability-in-react-cve-2025-55182&quot;&gt;Critical RCE Vulnerabilities Discovered in React &amp;amp; Next.js | Wiz Blog&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;unit42.paloaltonetworks.com&#x2F;cve-2025-55182-react-and-cve-2025-66478-next&#x2F;&quot;&gt;Critical Vulnerabilities in React Server Components and Next.js&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nvd.nist.gov&#x2F;vuln&#x2F;detail&#x2F;CVE-2025-55182&quot;&gt;NVD - CVE-2025-55182&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">2025年12月3日、React Server Components（RSC）とNext.jsにおいて、認証不要でリモートコード実行（RCE）が可能となる重大な脆弱性が公表されました。この記事では、この脆弱性の深刻度、CVE番号の統合経緯、そして当ブログでの対応状況について記録します。</summary>
        </entry><entry xml:lang="en">
        <title>GitHub Actionsでnpmパッケージ公開を自動化する - Trusted Publishingで実現するトークンレス運用</title>
        <published>2025-12-05T00:00:00+00:00</published>
        <updated>2025-12-05T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/12/automating-npm-publish-with-github-actions/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/12/automating-npm-publish-with-github-actions/</id>
        
            <content type="html">&lt;p&gt;本記事では、私が開発している&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;jrnl-mcp&quot;&gt;jrnl-mcp&lt;&#x2F;a&gt;パッケージで実装した、
GitHubが発表した&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.blog&#x2F;changelog&#x2F;2025-09-29-strengthening-npm-security-important-changes-to-authentication-and-token-management&#x2F;&quot;&gt;npmの認証強化&lt;&#x2F;a&gt;
対応の
Trusted Publishing (OIDC) を使用したトークン管理不要の自動公開について記載しています。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;npmの認証変更の背景&quot;&gt;npmの認証変更の背景&lt;&#x2F;h2&gt;
&lt;p&gt;GitHubは2025年9月29日に、npmのセキュリティ強化として以下の変更を発表しました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Classic Access Tokenの廃止&lt;&#x2F;li&gt;
&lt;li&gt;Trusted Publishing (OIDC) またはGranular Access Tokenへの移行推奨&lt;&#x2F;li&gt;
&lt;li&gt;より細かい権限管理の実現&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;移行先として2つの選択肢があります。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Granular Access Token&lt;&#x2F;li&gt;
&lt;li&gt;Trusted Publishing (OIDC)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Granular Access Tokenは、従来のトークン方式を改良したものでパッケージごとの権限管理が可能となっていますが、定期的なトークンのローテーションが必要です。
Trusted Publishingはトークンを完全に排除した新しい認証方式で、公開を自動化しトークンを完全に排除したものです。&lt;&#x2F;p&gt;
&lt;p&gt;jrnl-mcpでは、トークン管理の手間を完全に排除できる &lt;strong&gt;Trusted Publishing&lt;&#x2F;strong&gt; を採用しました。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;自動公開の仕組み&quot;&gt;自動公開の仕組み&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;全体のフロー&quot;&gt;全体のフロー&lt;&#x2F;h3&gt;
&lt;p&gt;jrnl-mcpでは、以下のフローで自動公開を実現しています。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;GitHubでリリースを作成&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Actionsが自動起動&lt;&#x2F;li&gt;
&lt;li&gt;依存関係のインストールとテストを実行&lt;&#x2F;li&gt;
&lt;li&gt;npmへ自動公開&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;この仕組みにより、リリース作成だけでパッケージの公開が完了します。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;GitHub_Actionsの設定&quot;&gt;GitHub Actionsの設定&lt;&#x2F;h3&gt;
&lt;p&gt;実際に使用しているワークフロー設定は以下の通りです。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Publish to npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  release&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    types&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;published&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;permissions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  contents&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; read&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  id-token&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; write&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  publish&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    runs-on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ubuntu-latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    steps&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Checkout code&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;checkout@v4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Setup Node.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        uses&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; actions&#x2F;setup-node@v4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          node-version&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;20&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;          registry-url&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;quot;https:&#x2F;&#x2F;registry.npmjs.org&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Install dependencies&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm ci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Run tests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm run test:ci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Publish to npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;        run&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm publish --provenance --access public&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;重要なポイントは、&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;GitHubのリリース機能を使用することで、手動でのトリガーが可能になる。これにより、意図しないタイミングでの公開を防ぐ。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;permissions&lt;&#x2F;code&gt;の設定により、GitHub Actionsはnpmに対して一時的なOIDCトークンを発行・認証する。長期的なトークンをSecretに保存する必要がない。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;npm publish --provenance --access public&lt;&#x2F;code&gt;により自動的にprovenance（出所証明）が生成され、パッケージがどのリポジトリから公開されたか検証可能となる。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;npm run test:ci&lt;&#x2F;code&gt;により公開前のテストを自動化する。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;Trusted_Publishing_の設定方法&quot;&gt;Trusted Publishing の設定方法&lt;&#x2F;h2&gt;
&lt;p&gt;Trusted Publishingを使用する場合、npm側での設定が必要です。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1._npm_でパッケージを公開&quot;&gt;1. npm でパッケージを公開&lt;&#x2F;h3&gt;
&lt;p&gt;まず、通常の方法で初回のパッケージを公開します（トークンを使用）。npm側でパッケージが存在している必要があるためです。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2._npm_で_Trusted_Publishing_を設定&quot;&gt;2. npm で Trusted Publishing を設定&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.npmjs.com&#x2F;&quot;&gt;npm のパッケージ設定&lt;&#x2F;a&gt;にアクセス&lt;&#x2F;li&gt;
&lt;li&gt;公開したパッケージの&quot;Settings&quot;タブを開く&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Publishing access&quot;セクションで&quot;Add a publisher&quot;を選択&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Actionsを選択し、以下を設定する
&lt;ul&gt;
&lt;li&gt;Repository: &lt;code&gt;&amp;lt;username&amp;gt;&#x2F;&amp;lt;repository-name&amp;gt;&lt;&#x2F;code&gt;（例: &lt;code&gt;yostos&#x2F;jrnl-mcp&lt;&#x2F;code&gt;）&lt;&#x2F;li&gt;
&lt;li&gt;Workflow: ワークフローファイル名（例: &lt;code&gt;publish.yml&lt;&#x2F;code&gt;）&lt;&#x2F;li&gt;
&lt;li&gt;Environment: 未指定（デフォルト）または特定の環境名&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;3._GitHub_Actions_の設定&quot;&gt;3. GitHub Actions の設定&lt;&#x2F;h3&gt;
&lt;p&gt;前述のワークフロー設定で、&lt;code&gt;id-token: write&lt;&#x2F;code&gt; 権限を付与するだけで完了です。トークンをSecretに保存する必要はありません。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;トークンベースとの比較&quot;&gt;トークンベースとの比較&lt;&#x2F;h3&gt;
&lt;p&gt;Trusted Publishingを使用することで、以下の作業が不要になります。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;npmトークンの作成と保存&lt;&#x2F;li&gt;
&lt;li&gt;GitHub Secretsへのトークン登録&lt;&#x2F;li&gt;
&lt;li&gt;トークンの定期的なローテーション（Granular Access Tokenの場合、最大90日ごと）&lt;&#x2F;li&gt;
&lt;li&gt;トークン漏洩のリスク管理&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;&#x2F;h2&gt;
&lt;p&gt;Trusted Publishing (OIDC) とGitHub Actionsを使用したnpmパッケージの自動公開により、以下のメリットが得られました。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;公開作業の効率化&lt;&#x2F;li&gt;
&lt;li&gt;トークン管理の完全な排除&lt;&#x2F;li&gt;
&lt;li&gt;セキュリティの向上&lt;&#x2F;li&gt;
&lt;li&gt;品質の担保&lt;&#x2F;li&gt;
&lt;li&gt;透明性の確保（自動provenance生成）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;特に、Trusted Publishingの導入により、トークンの定期的なローテーションや漏洩リスクの心配が不要になり、セキュリティと運用性が大幅に向上しました。npmパッケージを公開している方は、ぜひTrusted Publishingへの移行とGitHub Actionsによる自動化を検討してみてください。&lt;&#x2F;p&gt;
&lt;p&gt;Granular Access Tokenでもセキュリティは向上しますが、定期的なローテーション（最大90日ごと）が必要なため、可能であればTrusted Publishingの使用を推奨します。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.blog&#x2F;changelog&#x2F;2025-09-29-strengthening-npm-security-important-changes-to-authentication-and-token-management&#x2F;&quot;&gt;Strengthening npm security: Important changes to authentication and token management&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yostos&#x2F;jrnl-mcp&quot;&gt;jrnl-mcp GitHub Repository&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.npmjs.com&#x2F;about-access-tokens&quot;&gt;npm Documentation: About access tokens&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        <summary type="html">npm パッケージの公開を手動で行っていると、毎回トークンの管理やビルド、テストの実行など煩雑な作業が発生します。また、2025 年 9 月 29 日に GitHub が発表したnpmの認証強化により、Classic Token の廃止と、Trusted Publishing または Granular Access Token への移行が必要になりました。Trusted Publishing (OIDC) を使ってトークン管理不要のセキュアな公開フローを構築した手順を解説します。</summary>
        </entry><entry xml:lang="en">
        <title>Amazon AmplifyのNode.jsバージョンアップ対応</title>
        <published>2025-09-14T00:00:00+00:00</published>
        <updated>2025-09-14T00:00:00+00:00</updated>
        <author>
            <name>Toshiyuki Yoshida</name>
        </author>
        <link rel="alternate" href="https://codedchords.dev/blog/2025/09/amazon-amplify-node-versionup/" type="text/html"/>
        <id>https://codedchords.dev/blog/2025/09/amazon-amplify-node-versionup/</id>
        
            <content type="html">&lt;p&gt;I recieved the following email from AWS.&lt;&#x2F;p&gt;
&lt;p&gt;This blog does indeed use Amazon Amplify, but I thought it would be fine since I hadn&#x27;t specified a Node.js version and the default was being used.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;2025 年 9 月 15 日から、AWS Amplify コンソールは Node.js 14、Node.js 16、Node.js 18 のサポートを終了します。この日を過ぎると、Node バージョンをアップグレードするまでアプリケーションへの更新をデプロイできなくなります。2025 年 9 月 15 日までに、Node.js 14、Node.js 16、Node.js 18 を使用するすべてのアプリケーションを Node.js 20 以降に更新してください。&lt;&#x2F;p&gt;
&lt;p&gt;Node.js 14、Node.js 16、Node.js 18 ですでにデプロイされているアプリケーションは引き続き実行され、更新をデプロイする必要がない限り影響はありません。&lt;&#x2F;p&gt;
&lt;p&gt;アップグレードする前に新しいブランチでアプリケーションをテストして、すべての機能が正常に動作することを確認することをお勧めします。移行ガイドラインについては、[1] ページの「アプリケーションの Node.js バージョンを更新する必要がある」セクションを参照してください。&lt;&#x2F;p&gt;
&lt;p&gt;影響を受けるリソースのリストは、AWS ヘルスダッシュボードの「影響を受けるリソース」タブにあります。&lt;&#x2F;p&gt;
&lt;footer&gt;
    AWS 通知メール『AWS Amplify は、2025 年 9 月 15 日をもって Node.js 14&#x2F;16&#x2F;18 ベースのアプリのサポートを終了します』
    &lt;&#x2F;footer&gt;
  &lt;&#x2F;blockquote&gt;
&lt;p&gt;Just to be sure, I checked the Node version and found that Node 18 was being used. That&#x27;s no good.
Let&#x27;s explicitly specify the version and rebuild.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;version&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;frontend&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  phases&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    preBuild&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # Node.jsバージョンを24に指定（ローカルのMacと同じ）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; nvm use 24&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # バージョン確認（ログに出力）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; node --version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm --version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # .envを削除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rm -f .env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm ci --cache .npm --prefer-offline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;        # 環境変数を.envファイルに出力&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; echo &amp;quot;NEXT_PUBLIC_SITE_URL=https:&#x2F;&#x2F;blog.yostos.org&amp;quot; &amp;gt;&amp;gt; .env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;        (中略)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    build&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;      commands&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; npm run build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  artifacts&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    baseDirectory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .next&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    files&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-string&quot;&gt; &amp;#39;**&#x2F;*&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  cache&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    paths&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .next&#x2F;cache&#x2F;**&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .npm&#x2F;**&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        <summary type="html">2025年9月15日からAWS AmplifyがNode.js 14&#x2F;16&#x2F;18のサポートを終了するため、Node.js 24に更新した記録です。</summary>
        </entry>
</feed>
