
「二人が合意しなければ、共に歩めるだろうか」 [アモス書3:3]
先週、AmazonがAWS CloudFormationでのサードパーティリソース対応を発表しました。

DoiT Internationalでは、AWSとGoogle Cloudの両方を扱っており、何でも自動化するのが大好きです。AWS CloudFormationはAWSユーザーにとって優れたツールですが、近年は複数のクラウドを併用する企業が増えています。そこで、マルチクラウド環境でInfrastructure as Codeに取り組むお客様向けのProof of Conceptとして、CloudFormationでGoogle Kubernetes Engineクラスタを作成してみることにしました。
カスタムリソースの開発手順については、CloudFormation CLIのウォークスルーと、こちらのブログ記事がわかりやすくまとまっています。本稿では、開発中に私が直面したいくつかのポイントに絞って解説します。
新しいクラスタの起動にはKubernetes Engine APIを使います。まずサービスアカウントを作成し、以下のコマンドで適切なロールを付与してください。
gcloud projects add-iam-policy-binding my-project —-member serviceAccount:[email protected] —-role roles/iam.serviceAccountUser —-role roles/container.admin次に、IAMコンソール > Service Account Keyに移動し、キーをJSONファイルとしてダウンロードします。JSONの中身をコピーしたら、AWS Secrets Managerコンソールを開き、新しいプレーンテキストのシークレットを作成して、コピーした内容を貼り付けます。
コードからSecrets Manager APIを呼び出すには、AmazonWebServicesClientProxyを利用します。

なお、SAM で ローカルテストを行う場合は、次の行を
getSecretValueResult = clientProxy.injectCredentialsAndInvoke(getSecretValueRequest, client::getSecretValue);以下のように書き換える必要があります。
getSecretValueResult = client.getSecretValue(getSecretValueRequest);クラスタを作成するAPI呼び出しはすぐに返ってきますが、実際のクラスタ作成には2〜3分ほどかかります。進捗をモニタリングし、作成が成功(または失敗)した時点で初めて結果を返したいので、CallbackContextを使って作成ステータスをレポートしています。

クラスタ作成用のカスタムリソースの作り方さえ押さえれば、list、delete、updateといった他の操作を追加するのも難しくありません。このコードをベースに、他のGoogle Cloudサービス向けの独自カスタムリソースを作ることもできます。
コードはこちらで公開しています。
他の記事もぜひブログでチェックしてみてください。AvivのTwitterをフォローするのもおすすめです。