![[小ネタ] SecretsManagerを使ってCFnのGitHubTokenをシークレットにする](https://devio2023-media.developers.io/wp-content/uploads/2019/05/aws-secrets-manager.png)
[小ネタ] SecretsManagerを使ってCFnのGitHubTokenをシークレットにする
この記事は公開されてから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
何て間抜けなんでしょう。。。
ということで、ドキュメントはしっかりと読みましょう、という教訓になりました。(でもきっとまたやる気がする)
つい最近も、エラーメッセージはよく見ようね!というお言葉を頂きました。
はい、精進します。
以上です、どなたかのお役に立てば幸いです。






