この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
おはようございます、もきゅりんです。
先日、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
何て間抜けなんでしょう。。。
ということで、ドキュメントはしっかりと読みましょう、という教訓になりました。(でもきっとまたやる気がする)
つい最近も、エラーメッセージはよく見ようね!というお言葉を頂きました。
はい、精進します。
以上です、どなたかのお役に立てば幸いです。