CodeDeployでディレクトリのパーミッションを設定する

AWS CodeDeploy

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

CodeDeoloy使ってますか? ちょっとしたPHPのアプリケーションなどでは、デプロイツールを使うほどでもないことがあります(勿論、デプロイツールで自動化され、テストも行われるのが理想です)。 とはえいえ、AWSを利用しているとELB配下の複数台のEC2に設定することがほとんどです。 そんな場合には、気軽に使えたのがrsyncによるデプロイです。

今はCodeDeployがあります。 rsyncでデプロイしていたところはCodeDeploy使いましょう。

デプロイファイルのパーミッション

CodeDeployでは、デプロイ対象のファイル(群)をアーカイブ化して「リビジョン」と呼ばれるパッケージを作成します。 このリビジョンをデプロイ対象サーバに配置していくわけですが、デプロイ対象ファイルのパーミッションの設定が必要なケースは少なくありません。

例えば、アプリケーション内にキャッシュ用のtmpディレクトリがあり、apacheに書き込み権限を持たせなければならない、といった状況です。 こういった場合、appspec.ymlのpermissionsセクションを設定します。 permissionsセクションでは、objectで対象のファイル(ディレクトリ)を指定し、その他のオプションでowner, group, modeなどを設定します。

キャッシュディレクトリに書き込み権限を与える

最小限の構成でappspec.ymlを紹介します。

version: 0.0
os: linux
files:
  - source: /app/
    destination: /opt/app/
permissions:
  - object: /opt/app/tmp
    owner: apache
    group: apache
    mode: 744
    type:
      - directory

objectで対象となるディレクトリを指定し、typeにdirectoryを指定します。 後はowner, group, modeを要件にあわせて設定すれば、CodeDeployによるファイル配置後に設定された権限にディレクトリのパーミッションが設定されます。

適当にコピペしてご活用ください。

permissionsのパラメータ

appspecのpermissionsセクションにAWS CodeDeploy の AppSpec を読み解くでも解説されていますが、よく利用されそうな記述例を幾つか紹介します。

拡張子がshのファイルに実行権限を与える

CodeDeployでデプロイできるのはPHPなどのアプリケーションだけではありません。 もちろん、シェルスクリプトだってデプロイできます。 と、なれば拡張子がshのファイルに実行権限を与えたいでしょう。

permissions:
  - object: /opt/app/bin
    pattern: "*.sh"
    owner: ec2-user
    group: ec2-user
    mode: 744
    type:
      - file

対象のファイルはobjectで指定します。 この場合、patternが指定されているため、拡張子がshのファイルのみパーミッションが変更されます。 patternが指定されていない場合は、ディレクトリ配下のファイルすべてが対象です。

特定のファイルを除外したい

特定のファイルをパーミッション指定から除外したい場合は、exceptを指定します。

permissions:
  - object: /opt/app/
    pattern: "*.php"
    except: [install.php]
    owner: apache
    group: apache
    mode: 744
    type:
      - file

exceptは配列で指定してください。

まとめ

CodeDeployは、アプリケーション配備のためのサービスですが、スクリプトファイルの配置などにも使えそうですね。 他にも細かいオプションはありますので、ドキュメントもあわせて参照してください。