grasys blog

CodeDeployの1979年問題調べてみた

はじめまして、中村です。

2023年6月現在、CodeDeployを使用してファイルをインスタンス上にコピーすると全てのファイルが1979年12月31日と表示されるのが現状です。

こちらのバグは、CodeCommit上のタイムスタンプをCodeDeployが上手く読み取ることができないため、表示できなくなります。

こちらのバグを回避し、タイムスタンプを表示させるためにはビルド手順を挟むしかありません。

今回は、「本当にタイムスタンプを取得できないのか?」を調査してみました。

タイムスタンプを最新にするスクリプト

まずは、今回の問題を簡単に回避する「現在時刻でタイムスタンプを更新する」ための手法をご紹介します。

以下のファイルを作成or追記することで実現できます。

scripts/timestamp

#!/bin/bash
 
/usr/bin/touch /{更新したいファイルへのパス}/*
/usr/bin/chmod 755 /{更新したいファイルへのパス}
appspec.yml

hooks:
  AfterInstall:
    - location: scripts/timestamp
      timeout: 300
      runas: root

上記のスクリプトを仕込むことで、現在時刻にファイルのタイムスタンプを更新します。

しかし、それぞれのファイルがデプロイしたタイミング(CodePipelineが走った時間)で全て更新してしまうため、本来のタイムスタンプは破棄されてしまいますし、変更のないファイルも全て更新されます。

そのため、S3やgitから直接cloneしてタイムスタンプをまず確認して、タイムスタンプを取得できないか検証してみました。

S3にコピーしてみる

CodeCommit上のファイルを読み取ることができないだけであるため、S3に一度ファイルをコピーしてS3上からコピーしてみた。

しかし、S3のタイムスタンプの特性で、アップした時間のタイムスタンプを保持してしまうため、ファイル本来のタイムスタンプは棄却されてしまいました。

↓の画像はCodePipelineでS3へアップロードさした後の結果。
最終更新日(=timestampが全てCodePipelineを実行したものになってしまった。)

S3からアップロードさせたが、以下のようにタイムスタンプが棄却されていた。

↑と同じタイムスタンプのため、今回の手法ではタイムスタンプを取得できない。

Code Commitからgit pull

では、S3からのアップロードではなく単純にCodeCommitからファイルをgit pullした場合はどうなるのか?を検証してみた。

その結果、以下↓のようになった。

S3の時と変わらず、git cloneしてきた際のタイムスタンプで更新されることがわかった。

これらの検証から、CodeCommit自体がタイムスタンプを持たないため、タイムスタンプを必要な媒体にCodeCommit内のファイルがダウンロードされるときにタイムスタンプが新たに作成されることがわかった。

まとめ

今回はタイムスタンプを更新する方法を検討させていただきました。

すぐに組み込めるスクリプトを使用した更新方法(timestampスクリプトを仕込む方法)が実際に使用できるものとなります。

CodeCommitのタイムスタンプを取得する事が出来ず、CodePipelineとCodeDeployを使用した場合は、指定した全てのファイルを更新してしまうため、差分のみのタイムスタンプを更新することはできないのが現状となります。
 ※S3へアップする方法でも同様となります

そのため、CodeCommitのタイムスタンプを取得するのは上記の方法では不可能というのが結論となります。

次回記述する機会があれば、CodeDeployの動作にrsyncなどの差分のみを反映するように出来ないか?の検証をしたいと思います。

短い間でしたが、ご視聴いただきありがとうございました。


採用情報
お問い合わせ