Git 同期機能で「リンク済み」の CloudFormation スタック特定と API 経由でのリンクされたリポジトリの解除を行ってみた
いわさです。
これまでに何度か CloudFormation の Git 同期機能を試す機会がありました。
Git 同期のためには CloudFormation テンプレートファイルと、スタックパラメータなどを含むデプロイファイルをリポジトリに用意する必要があります。
そのため、私は検証時に GitHub 上に用意したサンプルリポジトリを使い回すことがありました。
CloudFormation の Git 同期でリンク済みリポジトリ選択時に「No connection exists with the ARN:」が発生
どうやら過去に Git 同期を使ったリポジトリはリンク済みとして情報が AWS 上に保存されるようです。
そのため新しくスタックを作成しようとした際にリンク済みのリポジトリ内から選択が可能です。
このリポジトリ、CodeConnections 接続を使って GitHub へ認証・認可されリポジトリにアクセスすることで取得出来るのですが、過去の検証の仮定で CodeConnections 接続を削除したことがありました。
そうした中で、先日過去にリンクされたリポジトリを選択してみると次のように接続が存在しないというエラーが発生し、対象リポジトリのブランチが取得・選択出来ない状態になりました。
そうか、接続を削除していたのだったなと思い新しい接続を作成し直しました。
その後、リンクされている Git リポジトリを再選択してみても上記と同じ状態に...。
接続が存在しないが「リンク済み」状態となり既存リポジトリとしても新規連携リポジトリとしても選択出来ない
そこで「新しく連携しなおせば良いのかな」と思い操作してみたところ、Git リポジトリリンク画面からは次のように「リンク済み」として選択が出来ない状態でした。
リンク済みリポジトリを使用しているスタックを特定出来ている場合は対象スタックの Git と同期タブから接続解除操作が出来そうでした。
リポジトリのリンク解除操作を行うために、Git スタックを特定する必要があります。
ただし、スタック一覧画面でリポジトリ情報での検索は出来ませんのでコンソールからだと一つづつスタック詳細画面を開いて Git 同期タブをチェックする必要があります。
スタック数が少ない場合はそれでも良さそうなのですがスタック数が多いとちょっと大変です。
API 経由でリンクされたリポジトリを使っているスタックを特定してみる
リンク解除したいリポジトリは特定出来ているので、そこから使っているスタックを特定してみたいと思います。
色々な API を試してみましたが、結論から言うと CloudFormation の各 API で取得は出来ないようです。
% aws cloudformation list-stacks
{
"StackSummaries": [
:
{
"StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/hoge0801git/ef511d90-4f85-11ef-9d47-0eb9172b1cf3",
"StackName": "hoge0801git",
"TemplateDescription": "---",
"CreationTime": "2024-07-31T21:43:33.704000+00:00",
"LastUpdatedTime": "2024-07-31T21:59:13.309000+00:00",
"StackStatus": "UPDATE_COMPLETE",
"DriftInformation": {
"StackDriftStatus": "NOT_CHECKED"
}
},
:
]
}
% aws cloudformation describe-stacks --stack-name hoge0801git
{
"Stacks": [
{
"StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/hoge0801git/ef511d90-4f85-11ef-9d47-0eb9172b1cf3",
"StackName": "hoge0801git",
"ChangeSetId": "arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/cloudformation-auto-sync-ecbf367c-71a0-45eb-a6bc-28a8c037d9a2/73da2d04-6f7b-4059-9e82-92467cdd70b0",
"Description": "---",
"CreationTime": "2024-07-31T21:43:33.704000+00:00",
"LastUpdatedTime": "2024-07-31T21:59:13.309000+00:00",
"RollbackConfiguration": {
"RollbackTriggers": []
},
"StackStatus": "UPDATE_COMPLETE",
"DisableRollback": false,
"NotificationARNs": [],
"Capabilities": [
"CAPABILITY_AUTO_EXPAND",
"CAPABILITY_NAMED_IAM",
"CAPABILITY_IAM"
],
"RoleARN": "arn:aws:iam::123456789012:role/hoge-test-CFNExecutionRole",
"Tags": [],
"EnableTerminationProtection": false,
"DriftInformation": {
"StackDriftStatus": "NOT_CHECKED"
}
}
]
}
なるほど。
CloudFormation 以外の別の API で管理されているのでしょうかね。あるいは稀にマネジメントコンソールでのみしか使えない、API が公開されていないやつとかありますけども。
CodeConnections API を使う
GitHub や GitLab などの接続を管理する CodeConnections 機能の API があるのですが、こちらでリポジトリのリンク操作や、リンクされたリポジトリの管理を行うことが出来るようです。
今回だと次の ListRepositoryLink API でリンクされたリポジトリ情報の一覧を取得することが出来ました。
% aws codeconnections list-repository-links
{
"RepositoryLinks": [
{
"ConnectionArn": "arn:aws:codeconnections:ap-northeast-1:123456789012:connection/60b78d05-51bb-4446-80d5-e18ce338f09f",
"OwnerId": "Tak1wa",
"ProviderType": "GitHub",
"RepositoryLinkArn": "arn:aws:codeconnections:ap-northeast-1:123456789012:repository-link/bb301db6-d2b8-4a95-a246-ebf3559ebe7e",
"RepositoryLinkId": "bb301db6-d2b8-4a95-a246-ebf3559ebe7e",
"RepositoryName": "aws-cfn-alb-ec2"
},
{
"ConnectionArn": "arn:aws:codestar-connections:ap-northeast-1:123456789012:connection/672805cc-55cf-4884-99b4-51cafe769da8",
"OwnerId": "Tak1wa",
"ProviderType": "GitHub",
"RepositoryLinkArn": "arn:aws:codeconnections:ap-northeast-1:123456789012:repository-link/41cbb6e1-71f6-47c3-ad61-92652a1b2afb",
"RepositoryLinkId": "41cbb6e1-71f6-47c3-ad61-92652a1b2afb",
"RepositoryName": "hoge0801-cfn-gitsync"
}
]
}
これでリンクされたリポジトリの ID(RepositoryLinkId)を取得することが出来ます。
その ID を使って ListRepositorySyncDefinitions API を実行することで CloudFormation スタックを特定することが出来ました。
% aws codeconnections list-repository-sync-definitions --repository-link-id 41cbb6e1-71f6-47c3-ad61-92652a1b2afb --sync-type CFN_STACK_SYNC
{
"RepositorySyncDefinitions": [
{
"Branch": "main",
"Directory": "./hoge0801-cfn-gitsync/stackdeployment.yaml",
"Parent": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/hoge0801git",
"Target": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/hoge0801git"
}
]
}
存在しない CloudFormation スタックにリンクされ続けているリポジトリを API で削除してみる
上記で関連づいているスタックを特定することが出来ました。
あとはスタックから解除操作を行えば良いのですが、誤ってそのままスタックを削除してしまいました。
スタック削除でリンク解除もされるのかな?と思って試してみたのですが、どうやらリンクされたままのようで、新しくリンクさせる操作は行えませんでした。先にリンク解除を行うべきだったのかも。
リンクされたリポジトリの更新・削除操作も API で可能
先ほどの CodeConnections API を使うことでことで参照だけでなくリンクされたリポジトリの情報を更新することも可能です。
今回は次の API を使ってリンクされたリポジトリの削除を行ってみます。
% aws codeconnections delete-repository-link --repository-link-id 41cbb6e1-71f6-47c3-ad61-92652a1b2afb
% aws codeconnections list-repository-links
{
"RepositoryLinks": [
{
"ConnectionArn": "arn:aws:codeconnections:ap-northeast-1:123456789012:connection/60b78d05-51bb-4446-80d5-e18ce338f09f",
"OwnerId": "Tak1wa",
"ProviderType": "GitHub",
"RepositoryLinkArn": "arn:aws:codeconnections:ap-northeast-1:123456789012:repository-link/bb301db6-d2b8-4a95-a246-ebf3559ebe7e",
"RepositoryLinkId": "bb301db6-d2b8-4a95-a246-ebf3559ebe7e",
"RepositoryName": "aws-cfn-alb-ec2"
}
]
}
削除出来ました。もう一度 CloudFormatin コンソール上で新規リポジトリのリンクを行ってみましょう。
良いですね。リンクが解除されたようで、今度はリポジトリを選択出来るようになりました。
さいごに
本日は Git 同期機能で「リンク済み」の CloudFormation スタック特定と API 経由でのリンクされたリポジトリの解除を行ってみました。
マネジメントコンソールからスタックの特定や、あるいは存在しないスタックにリンクされたリポジトリをどうにかしたい時は API で操作しましょう。
マネジメントコンソールからリポジトリのリンク操作が出来ずに困った方の参考になれば幸いです。