[小ネタ] SecretsManagerを使ってCFnのGitHubTokenをシークレットにする
おはようございます、もきゅりんです。
先日、CFnでGitHub + Fargate + CodePipelineを構築してみるをザッと書いたときに、CFnのパラメータで大事なアクセストークンを挿入するって大胆だよね、、と我ながら思ってました。
まぁ普通こういうものは秘匿するよね、ということで調べたところ、SecretsManagerで対応するようでした。
やってみる
とりあえず新しいシークレットを作成します。
勝手にローテションをされても困るので無効としておきます。
確認されます。
CFnで呼び出す際のリファレンスパターンは下記のようになっています。
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
簡単に主要な点をまとめるとこちらのようになっています。
reference-key | 入力値 |
---|---|
secret-id | シークレット名 or シークレットの完全な ARN |
secret-string | 現在、サポートされている値は SecretString のみ |
json-key | 値を取得するキーと値のペアのキー名を指定 |
versionの詳細などはドキュメントをご確認下さい。
テンプレートはこんな感じです。
# 必要な箇所のみ抜粋 Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Version: 1 Provider: GitHub Configuration: Owner: !Ref GitHubAccountName Repo: !Ref GitHubRepositoryName PollForSourceChanges: false Branch: !Ref Branch OAuthToken: '{{resolve:secretsmanager:DemoGitHubOAuthToken:SecretString:GitHubOAuthToken}}' RunOrder: 1 OutputArtifacts: - Name: App
ちなみにですが、リファレンスパターンで30分ほど泣かされました。。
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
これをそのまま参照してスタックを作成(更新)しようとすると
An error occurred (ValidationError) when calling the CreateStack operation: Given input did not match expected format
え、できないんだけど。。嘘でしょ。。何で??
ネットをうろつき、紆余曲折を経て、再度、例やリファレンスを見直してみますと、
現在、サポートされている値は SecretString のみです。
# 例. MyRDSInstance: Type: 'AWS::RDS::DBInstance' Properties: DBName: MyRDSInstance AllocatedStorage: '20' DBInstanceClass: db.t2.micro Engine: mysql MasterUsername: '{{resolve:secretsmanager:MyRDSSecret:SecretString:username}}' MasterUserPassword: '{{resolve:secretsmanager:MyRDSSecret:SecretString:password}}'
Oh。。。
secret-string -> SecretString
何て間抜けなんでしょう。。。
ということで、ドキュメントはしっかりと読みましょう、という教訓になりました。(でもきっとまたやる気がする)
つい最近も、エラーメッセージはよく見ようね!というお言葉を頂きました。
はい、精進します。
以上です、どなたかのお役に立てば幸いです。