GAEでPython 2.7をどうしても使い続けたい

## この記事の目的
Google App Engine は2024年1月末で [App Engine スタンダード環境の第1世代のサポートが終了](https://cloud.google.com/appengine/docs/standard/lifecycle/support-schedule?hl=ja)しました。これにより、第1世代であるPython2.7やJava8、PHP5.5などのコードがデプロイできなくなりました。

しかし、どうしても、Python2.7のコードをデプロイしたい！ させてほしい！ 世の中が Python3 で盛り上がってた最中でも、ずっと Python 2.7 しか提供してくれなかったのに、いまさらそりゃないですよ、先生・・・。
という人のために、しぶしぶ第1世代でのデプロイを許してもらえる方法があります。その方法を、自分のために記録に残す記事です。

:::note warn
2026年1月末には、さらに次の段階の「非推奨」になりますので、それまでにちゃんと新しい環境へ移行しましょう ＞自分
:::

## 何をするか
App Engine のドキュメント「[サポートが終了する以前のランタイムのデプロイを有効にする](https://cloud.google.com/appengine/docs/standard/long-term-support?hl=ja#enabling_deployments_for_legacy_runtimes_reaching_end_of_support)」に従って必要な対応を行います。

GCP には組織ポリシーという機能があり、その中に `constraints/appengine.runtimeDeploymentExemption` というポリシーが存在しています。これを有効にすると、第1世代のランタイムの継続的な使用が可能になります。

:::note warn
このポリシーを使用した以前のランタイムの使用は、試験運用版として扱われます。現状有姿で利用はできますが、サポートが制限されます。
:::

組織ポリシーをすでに利用中の方は問題なく使えると思いますが、組織ポリシーってなに？という状況から設定するまでの手順をまとめます。

:::note alert
私はGCP管理のど素人です。このドキュメントは自分のための作業メモですので、他の方が参照して何か起こっても責任は取れません。特に権限周りを触ることが多い手順ですので、何を行っているかを十分に理解した上で実行してください。
:::


## ゴールの確認

Google Cloud コンソールの[組織のポリシー](https://console.cloud.google.com/projectselector/iam-admin/orgpolicies?supportedpurview=project%2Cfolder%2CorganizationId&hl=ja)を開いて、デプロイしたいプロジェクトを選択し、リストから絞り込みなども使って「Runtime Deployment Exemption (App Engine)」というポリシーを探します。

![screenshot_policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151254/df3ef6f4-705f-8e3e-65e8-d35bfb28fe41.png)

やったね！ 編集できそう！ と思うわけですが、クリックしてもエラーが出るばかり。

![screenshot_policy_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151254/e7e43d72-0058-3a74-eae6-3820a62b5583.png)

これをなんとかするのが今回の長い旅の目的です。

## 手順

### 組織リソースがあることを確認する

組織ポリシーを適用するには、組織がないといけません。

GCPのいう組織リソースとは、Google Workspace (Gmailなどが組織として使えるやつ；だいたい有料）か、Google Cloud Identity（Gmailを使えない、組織のドメインのGoogleアカウントを発行できるやつ；無料版あり）のどちらかと紐付いている存在です。両方とも、組織のドメインがないと登録できない気がします。たぶん。

上記の2サービスと紐付いているGoogleアカウントでGCPを利用すると、自動的に組織リソースが作成されます。先にGCPを利用していた場合はプロジェクト作成時などに自動作成されるそうです。そして、Google WorkspaceもしくはCloud Identityの特権管理者に通知が行くので、特権管理者が適切にGCPの組織リソースを設定する、というのが大まかな流れとなります。

困ったことがあったら、Resource Manager の[組織リソースのドキュメント](https://cloud.google.com/resource-manager/docs/creating-managing-organization?hl=ja)を参照してください。

### 組織ポリシーを編集する権限を付与する

組織ポリシーを編集するアカウントには roles/orgpolicy.policyAdmin ロールが必要となりますので、付与します。

[IAMの管理画面](https://console.cloud.google.com/iam-admin/iam?hl=ja)を開き、一番上のドロップダウンを開くと、「リソースを選択」というウィンドウが開きます。ここで、「組織なし」が選ばれていたら、そのドロップダウンを開いて、前のステップで追加されているはずの組織リソースを選びます。たぶん組織のドメイン名などになっているのではないでしょうか。

ドロップダウンを切り替えると、ビルみたいなアイコンの項目が下に出てくると思いますので、それを選びます。

『組織「〜」に対する権限』というページタイトルが出ていれば正しい画面です。

今回、組織ポリシーを編集したいアカウント（プリンシパル）がリストにあれば、その項目の鉛筆アイコンをクリックして編集モードに入ります。

新しい人を管理者にしたい場合は、「アクセス権を付与」をクリックします。

プリンシパルという用語が時々出てきますが、利用者個人を指すときには、Googleアカウントのメールアドレスのことだと思っていれば大丈夫です。

ここで、通常のGCPの管理をする方には「組織の管理者」というロールが振られていると思います。これに加えて、「組織ポリシーの管理者」という別のロールを追加することで、組織ポリシーの編集が行えるようになります。

![screenshot_iam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151254/667046a5-869f-a631-4ec5-378a7012fc1b.png)

:::note warn
「組織の管理者」はGCPで自由に振る舞える強い権限です。また、「組織ポリシーの管理者」は組織のGCP利用に関して、様々な制約（組織ポリシー）を付けたり外したりできるこれまた強い権限です。信用できる人にのみ付与しましょう。
:::

### 組織ポリシーを適用できるよう、プロジェクトを組織リソースに移行する

「組織なし」で作成しているプロジェクトは組織ポリシーを適用できませんので、組織リソースに移行します。なお、この手順は元に戻せません。

[IAMの設定画面](https://console.cloud.google.com/projectselector2/iam-admin/settings?hl=ja)から、移行したいプロジェクトを選択し、上に並んでいる「移行」をクリックします。

移行先として、上で設定した組織リソースが選択可能となっているはずですので、移行します。

細かい注意事項などは Resource Manager のドキュメント「[組織リソースのないプロジェクトの移行](https://cloud.google.com/resource-manager/docs/handle-special-cases?hl=ja#migrating_projects_no_org)」にあります。移行すると組織ポリシーが適用されるよ、ということと、移行後に「組織なし」には戻せないよ、という2点が大きな注意点です。


### Runtime Deployment Exemption (App Engine) ポリシーを設定する

ようやく、ここまでこれました！ 組織ポリシーで、GAE の第一世代のランタイムの実行許可を設定します。

プロジェクト単位で組織ポリシーを設定しても良いですが、組織内の様々なプロジェクトで古いランタイムのデプロイを行う可能性があるのであれば、組織の組織ポリシーで変更するのが簡単でしょう。

[組織のポリシーの設定画面](https://console.cloud.google.com/projectselector2/iam-admin/orgpolicies?supportedpurview=organizationId&hl=ja)から、「組織なし」ではなく、設定したい組織を選択し、フィルタに「Runtime Deployment Exemption (App Engine)」と入力して、出てきた権限をクリックします。

「ポリシーを管理」をクリックして、ラジオボタンで「カスタマイズ」を選択。ポリシーの適用を「置き換える」に。そして、ルールを設定します。「すべて許可」にすると、JavaもPHPもPythonもデプロイできるようになります。個別に指定する場合は、値をカスタムにし、`python27`, `java8`, `php55`のうち許可したいレガシーランタイムを指定してください。

![screenshot_policy_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151254/c2de9b0d-e324-d59d-0e14-7e60d8068e27.png)


以上でレガシーランタイムがデプロイできるようになったはずです！