PHP
AWS
buildpack

AWSでBuildpackを作成する方法

作成したAWSインスタンス

Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-40142d25
Type t2.micro
ボリューム:8GB

まずは、Goをインストールしてセットアップします。

こちらのサイトを参考にセットアップしました。

インストール

sudo yum install golang

GOPATHの設定

.bashrcに以下を追記します。

export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

source .bashrcを実行して環境変数を反映させたらecho $GOPATHで確認しましょう。

結果

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ echo $GOPATH
/home/ec2-user/go

となればOKです。

次にbuild-packagerをインストールします。

このサイトREADOMEに従って、以下のコマンドを実行します。

go get github.com/cloudfoundry/libbuildpack

で、マニュアルでは次に

cd ~/go/src/github.com/cloudfoundry/libbuildpack/packager/buildpack-packager && go install

とすると書いてあるのですが、AWS上でこのまま実行すると

main.go:15:2: cannot find package "github.com/google/subcommands" in any of:

というメッセージが出てしまいます。

というわけで、こちらのパッケージも入れておきましょう。

コマンドは、

go get github.com/google/subcommands

です。

改めて、

cd ~/go/src/github.com/cloudfoundry/libbuildpack/packager/buildpack-packager && go install

とすると、正常にインストールできます。

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ buildpack-packager
Usage: buildpack-packager <flags> <subcommand> <subcommand args>

Subcommands:
        commands         list all command names
        flags            describe all known top-level flags
        help             describe subcommands and their syntax

Subcommands for Custom:
        build            Create a buildpack zipfile from the current directory
        init             Creates a folder with the basic structure of a new buildpack
        summary          Print out list of dependencies of this buildpack
        upgrade          Upgrades a buildpack scaffolded by buildpack-packager init


Use "buildpack-packager flags" for a list of top-level flags

となる事を確認しましょう。

パッケージをビルドしてみましょう。

私はPHPerなので、php-buildpackをforkしてカスタマイズします。
まずは、

git clone https://github.com/motuo1201/php-buildpack

でforkしたリポジトリをcloneします。

次に、

cd php-buildpack/
buildpack-packager build -cached -any-stack

とすると、以下の結果を得ることが出来ます。

[ec2-user@ip-XXX-XXX-XXX-XXX php-buildpack]$ buildpack-packager build -cached -any-stack
cached buildpack created and saved as /home/ec2-user/php-buildpack/php_buildpack-cached-v4.3.59.zip with a size of 979MB
[ec2-user@ip-XXX-XXX-XXX-XXX php-buildpack]$ ls
4.3.52.20180419122106tmp  fixtures                            README.md
bin                       ISSUE_TEMPLATE                      requirements.txt
cf.Gemfile                itf.Dockerfile.5409018274803835473  run_tests.sh
cf.Gemfile.lock           lib                                 scripts
CHANGELOG                 LICENSE                             src
compile-extensions        manifest.yml                        tests
CONTRIBUTING.md           NOTICE                              vendor
defaults                  php_buildpack-cached-v4.3.59.zip    VERSION
extensions                PULL_REQUEST_TEMPLATE

ここに、php_buildpack-cached-v4.3.59.zipというファイルが出来ましたね。
これが、実際に利用できるbuildpackとなります。

ちなみに、Buildpackを作成しようとした経緯

php-buildpackを使ってLaravelをデプロイする時に、.envが無くてコケるケースが多発。
原因はGithubのリポジトリには.envをコミットしない原則があるから。(セキュリティ的な観点から当然の事ですが…)

ただ、pipelineとか使ってGithubから直接、デプロイする時に、これは困る!というわけで

.env.exampleが存在するかつ、.envファイルがない場合は、.env.exampleを.envにリネームする

処理を追加する事に決定。

いや、composer.jsonのpost-install-cmdに書けよ!

というツッコミが聞こえた気がしますが、今回は勉強のため…

そしてAWSでbuildpack作った後で気が付いた:cry:

IBM CloudってGitのリポジトリから、Buildpackを作って適用しているんじゃないか?という事を。