[小ネタ] SecretsManagerを使ってCFnのGitHubTokenをシークレットにする

2019.06.19

おはようございます、もきゅりんです。

先日、CFnでGitHub + Fargate + CodePipelineを構築してみるをザッと書いたときに、CFnのパラメータで大事なアクセストークンを挿入するって大胆だよね、、と我ながら思ってました。

まぁ普通こういうものは秘匿するよね、ということで調べたところ、SecretsManagerで対応するようでした。

動的な参照を使用してテンプレート値を指定する

やってみる

とりあえず新しいシークレットを作成します。

make a secret

make a secret2

勝手にローテションをされても困るので無効としておきます。

make a secret3

確認されます。

confirm secret

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

何て間抜けなんでしょう。。。

ということで、ドキュメントはしっかりと読みましょう、という教訓になりました。(でもきっとまたやる気がする)

つい最近も、エラーメッセージはよく見ようね!というお言葉を頂きました。

はい、精進します。

以上です、どなたかのお役に立てば幸いです。

参考

動的な参照を使用してテンプレート値を指定する

Securing GitHub Tokens in a Serverless CodePipeline