概要
AWS CloudformationのGit同期機能を実施しました。
差分確認や履歴保持にはとても良いですが、いくつか注意点もあるなと感じたので紹介します。
注意点
設定手順などは公式ドキュメントや他の方の記事をご参照ください。
個人的に感じた注意点は以下の2点。
①手入力のパラメータを持つテンプレートが管理できない
②CloudformationのIAMロール権限が大きくなりがち
①手入力のパラメータを持つテンプレートが管理できない
例えば、以下のようなYAMLをGit同期してみます。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
RoleName:
Type: String
NoEcho: true
Resources:
CloudWatchEventsRoleSample:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
-
Effect: Allow
Principal:
Service:
- events.amazonaws.com
Action:
- sts:AssumeRole
Path: "/"
RoleName: !Ref RoleName
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonEC2FullAccess
すると、同期時に以下のエラー。
RoleName
に値がないといわれています。
これは、AWSマネジメントコンソールのCFスタック更新画面から更新する場合は、手入力でパラメータを設定できますが、Git同期機能ではできないため。
Failed to create changeset. Couldn't call cloudformation for stack: sample-template and changeset: cloudformation-auto-sync-xxxxxx because of a validation error. The error was Parameters: [RoleName] must have values (Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError; Request ID: xxxxxx; Proxy: null)
では、一度UIからアップロードして手動で値を手入力した後にgit同期機能に変更したらどうなるのか?
ひょっとして手動設定した際の機密ワードが裏で残ってて、git同期した時も引き継がれたりしないかな?という淡い期待を胸にいざ実行。以下はGit同期の際に必要となるスタックデプロイファイルというものです(Git同期時に自動で作成され、AWS botからPullRequestが飛んできます)。
template-file-path: sample_app/sample-template.yaml
parameters:
RoleName: '****'
tags: {}
エラーでした笑
Resource handler returned message: "The specified value for roleName is invalid. It must contain only alphanumeric characters and/or the following: +=,.@_- (Service: Iam, Status Code: 400, Request ID: xxxxx)" (RequestToken: xxxxx, HandlerErrorCode: GeneralServiceException)
'****'
という名前としてCfnに渡されてしまっています。
文字列として不適切なものが渡されているというエラーになってしまいました。それはそうか。
うーむ、とはいえ、DBの大事なパスワード情報とか、Githubに永遠に残すのはなんか嫌だなというのはありますよね...。
他のテンプレートは全てgitなのに一部だけgit連携しない、という状態になるとそれはそれで後々面倒になるなぁとも思います。
この点は、Git同期機能に完全移行!とはならない点だなと思いました。
②CloudformationのIAMロール権限が大きくなりがち
Git同期のIAMロールは公式ドキュメントにも記載あるので、そちら参考にすれば簡単です。
ただし、Cloudformation自体のIAMロールが少し面倒です。
というのも、今までAdministratorAccess
ロールをもつIAMユーザーでアップロードや編集できていたものが、今後はCloudformation自体が実行する必要があるためです。
そのため、STS
だけではなくiam:GetRole
などなど必要になったりで、権限が大きくなりがちだなと思いました。
基本的に権限周りは最小限にするのが鉄則。アクセスが自由なロールを不用意に使い回してしまうリスクは許容できたとしても、顧客によってはその説明・説得が必要となることもあるのでやや面倒かもです。社内システムなどでは問題なく使えるかもしれません。