AWSでBuildpackを作成する方法

## 作成したAWSインスタンス
Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-40142d25
Type t2.micro
ボリューム:8GB

## まずは、Goをインストールしてセットアップします。
[こちらのサイト](https://dev.classmethod.jp/cloud/aws/amazon-linux-go-setup/)を参考にセットアップしました。

#### インストール
```
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をインストールします。
[このサイト](https://github.com/cloudfoundry/libbuildpack/tree/master/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を作って適用しているんじゃないか？という事を。