🔰

【対応方法】cdk : このシステムではスクリプトの実行が無効になっているため、ファイル(cdk.ps1) を読み込むことができません。

2024/01/01に公開

概要

Windows端末で"cdk init"を実行した際に起こるPSSecurity-exceptionの原因と対処法について紹介します!初歩的な内容ですが、Windows端末でAWS CDKの勉強を始めようとするとみんな通る道かと思うので、何かの役にたてば幸いです。

エラー全文

普段使わない端末でcdk initを実行しところ、PowerShwllの実行権限がなく失敗...

cdk init sample-app --language typescript
cdk : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\miyab\AppData\Roaming\npm\cdk.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ cdk init sample-app --language typescript
+ ~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

原因

powershell(.ps1)の実行を無効に設定されているため。
「Get-ExecutionPolicy」コマンドレットで現在の「ExecutionPolicy」を確認したところ、
Restricted(制限あり)の状態になっている。
どうやらWindowsのクライアント端末ではデフォルトでRestricted(制限あり)が設定されているよう。

> Get-ExecutionPolicy 
Restricted

対処方法

ExecutionPolicyをRemoteSignedに変更してあげる。
セキュリティ的に、 実行中のプロセスのみをスコープにする。

#ExecutionPolicyを設定(Set-ExecutionPolicy)。
> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
> Get-ExecutionPolicy
RemoteSigned

改めて、cdk initを実行したところ無事に成功!

> cdk init sample-app --language typescript
Applying project template sample-app for typescript
# Welcome to your CDK TypeScript project
(以下略)

(参考) ExecutionPolicyとScopeの一覧

MSの公式ドキュメントより引用
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.4

ExecutionPolicy

ExecutionPolicy 説明
AllSigned すべてのスクリプトと構成ファイルが、ローカル コンピューターで記述されたスクリプトを含め、信頼できる発行元によって署名されている必要があります。
Bypass 何もブロックされず、警告やプロンプトは表示されません。
Default 既定の実行ポリシーを設定します。 Windows クライアントまたは Windows サーバーの場合は RemoteSigned に制限されます。
RemoteSigned インターネットからダウンロードしたすべてのスクリプトと構成ファイルが、信頼できる発行元によって署名されている必要があります。 Windows サーバー コンピューターの既定の実行ポリシー。
Restricted 構成ファイルを読み込んだり、スクリプトを実行したりしません。 Windows クライアント コンピューターの既定の実行ポリシー。
Undefined スコープに対して実行ポリシーが設定されていません。 グループ ポリシーによって設定されていないスコープから、割り当てられた実行ポリシーを削除します。 すべてのスコープの実行ポリシーが未定義の場合、有効な実行ポリシーは Restricted になります。
Unrestricted PowerShell 6.0 以降では、これは Windows 以外のコンピューターの既定の実行ポリシーであり、変更することはできません。 すべての構成ファイルを読み込んで、すべてのスクリプトを実行します。 インターネットからダウンロードされた署名されていないスクリプトを実行すると、実行前にアクセス許可の入力を求められます。

Scope

Scope 説明
MachinePolicy コンピューターのすべてのユーザーのグループ ポリシーによって設定されます。
UserPolicy コンピューターの現在のユーザーのグループ ポリシーによって設定されます。
Process 現在の PowerShell セッションにのみ影響します。
CurrentUser 現在のユーザーにのみ影響します。
LocalMachine コンピューターのすべてのユーザーに影響を与える既定のスコープ。

Discussion