AWS Protonのアカウント接続機能の使い方を確認する

2022.01.29

いわさです。

AWS Protonにはアカウント間の連携機能がありまして、非Organizationsアカウントでも利用が可能です。最高なのでは。

Environment account connections - AWS Proton

ただし、最初私はこの機能を勘違いしていました。
あるアカウント作成したテンプレートを別のアカウントへ共有する機能だと思いこんでました。
本日はどういう機能なのかを紹介します。

この記事では、AWSのドキュメントにあわせて複数のアカウントをそれぞれ「管理アカウント」と「環境アカウント」と記述します。

先にまとめ

  • 別のアカウントを「環境アカウント」として管理下におくための機能
    • 環境アカウントへは、管理アカウントからデプロイを行う
    • あくまでもデプロイ操作は管理アカウント。管理アカウントのテンプレートを使って環境アカウントでデプロイ操作が出来るわけではない。

アカウント接続方法

接続はとても簡単です。

環境アカウントから管理アカウントへ接続リクエストを送信する

インフラストラクチャがデプロイされる「環境アカウント」から、デプロイ操作を行う「管理アカウント」へ接続リクエストを送信します。
リクエスト送信時には管理アカウントのAWSアカウントIDが必要です。

リクエストが送信されると、ステータスがPendingとなります。

管理アカウントで接続リクエストを許可する

リクエストが送信された管理アカウントを見ると、保留中のリクエストを確認することが出来ますので、承認します。

リクエスト元はAWSアカウントIDを入力するだけでリクエスト出来るので、身に覚えの無いアカウントからリクエストされる可能性もゼロではないですね。
その場合はリクエストを却下することも出来ます。

とはいえ、誤って想定外のリクエストを承認してしまったとしても、環境アカウントから管理アカウントへ何かしらの操作は一切出来ません。

環境を作成してみる

アカウントの接続が完了したら、実際にテンプレートから環境を作成してみましょう。

環境アカウントのProtonで環境を作成

その前に、アカウント連携したことで何がどうなったのかを確認してみます。
まずは、環境アカウントから環境を作成してみましょう。

テンプレートがありませんね。なるほど。
環境アカウントから、管理アカウントのテンプレートを参照することは出来ません。

管理アカウントのProtonで環境を作成

次に、管理アカウントを環境を作成してみましょう。
展開先に「環境アカウント」を指定します。
そうすると、環境アカウントの接続に先程接続した接続名が表示され、環境名も自動入力されます。なるほど。

そのままデプロイを進めてみると、別アカウントに作成されたProton環境は管理アカウント上で確認が出来るようになりました。
通常のProton環境と同列です。

ですので、環境の更新作業なども管理アカウント上で行う形になります。
環境の詳細情報を見てみると、環境アカウントIDには環境アカウントが、環境ARNには管理アカウントのアカウントIDが使われていますね。

作成されたProton環境を環境アカウントで確認してみる

では、デプロイ後に、環境アカウント上ではどのように見えるのかも確認してみましょう。

まず、Protonコンソール上から環境の確認は出来ません。
何も作成されていないですね。

しかしCloudFormationスタックは環境アカウント上で展開されています。当然ながらリソースもです。
Protonとして管理アカウントでコントロールしていますが、リソースの実体だけは環境アカウントにデプロイされている形ですね。

アカウント接続はリージョンごとに必要

今回は東京リージョンで接続を行いましたが、もし別リージョンにProton環境を作成したい場合は、対象リージョン上であらためて接続の作成が必要です。

ちなみに、本日時点でProtonの対象リージョンはまだ少ないです。
今後対象が広がっていってほしいですね。

接続の切断と再接続

アカウントの接続方法は確認出来ましたが、切断の手順なども確認しておきましょう。

接続拒否

まず、管理アカウントからは既存接続への「拒否」が可能です。
拒否を行うことで、既存接続がRejectedステータスとなり、利用できなくなります。

ただし、対象接続を使ったデプロイ環境が存在する接続は管理アカウントからの拒否操作をすることが出来ません。
マネジメントコンソール上は拒否に成功した旨が表示されるのですが接続されたままです。
ちなみにCLIだと以下のようにエラーとなります。

[cloudshell-user@ip-10-0-112-237 ~]$ aws proton reject-environment-account-connection --id 4e4f3ead-234d-4e7b-b452-6ec3fdba8407

An error occurred (ValidationException) when calling the RejectEnvironmentAccountConnection operation: Environment account connection: 4e4f3ead-234d-4e7b-b452-6ec3fdba8407 cannot be rejected as there are environments using it

接続が不要になった場合は、事前に環境を削除しておきましょう。

接続削除

環境アカウントからは既存接続の「削除」が出来ます。
削除操作は、環境が存在していても、一方的に環境アカウントから実行することが出来ます。

削除すると管理アカウントからも接続情報が削除されます。

接続を削除した場合で既存環境が存在していると、管理アカウント上ではProton環境は存在したままとなります。
また、環境アカウント上でもCloudFormationスタックが残ったままです。

再接続

先程の接続削除操作を行って、残った環境を更新しようとすると、紐付いている接続がないというエラーになってしまいます。

Environment account connection: f51f7a8f-60d8-4859-852f-16d95ccaed32 was not found. It might be deleted by the environment account

こちらは解決策がありまして、別の接続への環境の再接続を行うことで再び既存のProton環境から既存のリソースを更新出来るようになります。

まずは、環境アカウントへ新しい接続を用意してリクエストを許可しておきます。

そして、環境に対してupdate-environmentを使って新しいアカウント接続IDを設定してやることがアカウント間の関連付けが復活します。

[cloudshell-user@ip-10-0-112-237 ~]$ aws proton update-environment --name iwasa2 --deployment-type NONE --environment-account-connection-id fb5204e7-831c-4406-a754-ad7f91787648
{
    "environment": {
        "arn": "arn:aws:proton:ap-northeast-1:123456789012:environment/iwasa2",
        "createdAt": "2022-01-24T21:56:36.017000+00:00",
        "deploymentStatus": "FAILED",
        "deploymentStatusMessage": "Environment account connection: f51f7a8f-60d8-4859-852f-16d95ccaed32 was not found. It might be deleted by the environment account",
        "description": "aaabbb",
        "environmentAccountConnectionId": "fb5204e7-831c-4406-a754-ad7f91787648",
        "environmentAccountId": "748796684458",
        "lastDeploymentAttemptedAt": "2022-01-24T22:05:39.284000+00:00",
        "lastDeploymentSucceededAt": "2022-01-24T21:56:36.017000+00:00",
        "name": "iwasa2",
        "templateMajorVersion": "2",
        "templateMinorVersion": "4",
        "templateName": "hoge"
    }
}

更新出来るようになりましたね。

さいごに

本日は、AWS Protonのアカウント接続機能を紹介しました。

本番アカウントには最小限のリソース作成・操作に留めたい、デプロイされるためだけのアカウントを用意したい、というケースにProtonのアカウント接続機能はとても有効だと思います。
一方で、別アカウントでデプロイ操作をさせる場合の使い方ではないので、マルチアカウントの運用方法の設計が重要になりそうです。