Proxy配下のGitLab PipelinesからS3にファイルをアップロードする

Proxy配下で動いているGitLabから、パイプライン (GitLab Runner) を用いてAWS上のS3にファイルをアップロードする方法のメモを残します。


Introduction

f:id:BioErrorLog:20200306222558p:plain 社内環境など、Proxy環境下にあるGitLabから、GitLab Runnerを介してAWSのS3バケットにファイルをアップロードするやり方を残します。

Proxy環境下で動いているGitLabで開発している際、レポジトリへのPushをトリガーとしてコードをS3にアップロードしたいと思ったのですが、自分はproxyを跨いだGitLabとAWSとの繋ぎで詰まりました。

備忘録として、この手順を書き出していきます。


Proxy配下の環境となると、ものによって大きく事情が異なるかもしれませんが、少しでも自分と同じ状況にあたった方の役に立てば幸いです。


※なお、本記事中の参考画像は実際のProxy下の環境で撮ったものではなく、後で個人的にgitlab.com上のレポジトリで再現したものです。 画面に細かい違いはあるかもしれませんが、流れは変わらないのでご容赦ください。


Results

S3バケットの作成

まずは、最終的にファイルをアップロードするS3バケットを作成します。

S3のマネジメントコンソールから、以下のように任意のリージョン・バケット名でS3バケットを作成します。

f:id:BioErrorLog:20200308104014p:plain
バケットの作成: 名前とリージョン


f:id:BioErrorLog:20200309190914p:plain
バケットの作成: オプション設定

今回はとりあえずバージョニングを有効化して次へ。


f:id:BioErrorLog:20200308105345p:plain
バケットの作成: アクセス許可の設定

アクセス許可の設定も、デフォルトのまま次へ。
後にIAMユーザーを作成し、その権限でS3バケットにファイルをアップロードするので、パブリックアクセスをブロックしたままで問題ありません。


f:id:BioErrorLog:20200308105950p:plain
バケットの作成: 確認

バケットを作成したら、リージョンとバケット名をメモしておきます。 これらは後の設定で使います。

今回の場合だと、

リージョン: ap-northeast-1
バケット名: gitlab-pipeline-test

となります。


S3バケットの作成は以上です。

次は、このS3バケットにファイルをアップロードする権限を持つIAMユーザーを作成します。


IAMユーザーの作成

IAMのマネジメントコンソールから、次の手順でIAMユーザーを作成していきます。

ユーザー名は任意、アクセスの種類は"プログラムによるアクセス"を選択します。 f:id:BioErrorLog:20200308111816p:plain


アクセス許可の設定では、作成したS3バケットへのPut権限を持つ新規のポリシーを作成します。

f:id:BioErrorLog:20200308112548p:plain
ポリシーの作成


ポリシーには以下のようにして、S3バケットへのPutを許可します。
f:id:BioErrorLog:20200308114737p:plain

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": ["arn:aws:s3:::XXX/*"]
    }
  ]
}

※"Resource"の"XXX"は、先ほど作成したバケット名に置き換えてください。

ポリシーを入力したら、任意の名前でIAMポリシーを作成します。 f:id:BioErrorLog:20200308114147p:plain


IAMポリシーを作成したら元のIAMコンソールに戻り、いま作成したIAMポリシーをアタッチします。 f:id:BioErrorLog:20200308115304p:plain

この後のタグ等の設定は今回は特に行わず、そのままIAMユーザーを作成します。


無事にIAMユーザーを作成したら、忘れずにセキュリティ認証情報をダウンロードします。
これは後の認証に使う重要な情報です。 f:id:BioErrorLog:20200308120735p:plain


IAMユーザーの作成は以上です。


GitLabの設定

次に、GitLabレポジトリのPipelineを設定していきます。

レポジトリ画面から Settings > CI/CD に行きます。 f:id:BioErrorLog:20200308143111p:plain


ここでは、RunnersVariablesを設定します。


Runnersの設定

Runnersとは、GitLabパイプラインのジョブを実行主体となるツールです。

RunnerにはSpecific RunnersShared Runnersの二種類があります。

Specific Runnersはプロジェクト専用にインストールできるもので、
Shared Runnersは共用利用されるものです。

利用可能なShared Runnersがある場合は、そのままパイプラインを走らせることが出来ます。
Shared Runnersがない場合は、Specific Runnersをインストールする必要があります。

今回私はSpecific RunnersをインストールせずにShared Runnersを利用しますが、Specific Runnersが必要な場合は以下のページなどを参考にインストールしてください。

Install GitLab Runner | GitLab

GitLab RunnerでCI/CDしてみる(前編) | Developers.IO


Variablesの設定

次に、Variablesに設定変数を埋め込んでいきます。

ここにIAMユーザーのアクセスキーやS3のバケット名などを与えておくことで、ソースコードにこれら機密性の高い情報をハードコーディングせずに、パイプラインに環境変数として渡すことができます。

またここでプロキシ情報を与えておくことで、プロキシを介して通信を行わせることが出来ます。

以下のように情報を埋め込んでいきます。

Key Value 説明
AWS_DEFAULT_REGION ap-northeast-1 S3バケットを作成したリージョン
S3_BUCKET gitlab-pipeline-test S3バケット名
S3_OBJECT_KEY pipeline-test オブジェクトキー名を任意に設定
AWS_ACCESS_KEY_ID XXX 作成したIAMユーザーのAccess key ID
AWS_SECRET_ACCESS_KEY XXX 作成したIAMユーザーのSecret access key
http_proxy http://your.proxy:PORT Proxyとポート番号
https_proxy http://your.proxy:PORT Proxyとポート番号
HTTP_PROXY http://your.proxy:PORT Proxyとポート番号
HTTPS_PROXY http://your.proxy:PORT Proxyとポート番号


ちなみにMaskedを有効にすると、ジョブ実行のログにおいても変数を隠すことが出来ます。 AWS_ACCESS_KEY_IDやAWS_SECRET_ACCESS_KEYなど重要情報は、Maskedをオンにすることがお勧めです。


Variablesの設定は以上です。

次は、パイプラインの処理を.gitlab-ci.ymlに定義していきます。


.gitlab-ci.ymlの作成

.gitlab-ci.ymlは、パイプラインの処理を定義するymlファイルです。

.gitlab-ci.ymlを含めてレポジトリにPushすると、その中の記述に従ってパイプラインがジョブを実行します。

今回は以下のように.gitlab-ci.ymlを記述して、S3バケットにレポジトリのソース (今回はREADME.mdのみ) をアップロードさせます。

pipeline:
  image: python:3.6.5
  before_script:
    - apt-get update
    - apt-get install -y zip
    - pip install --upgrade awscli
  script:
    - SOURCES="./README.md"
    - rm -f src.zip
    - zip -r src.zip $SOURCES
    - aws s3api put-object --bucket $S3_BUCKET --key $S3_OBJECT_KEY --body src.zip


パイプラインの実行

では、作成した.gitlab-ci.ymlを含めてGitLabレポジトリにPushし、パイプラインを走らせます。

パイプラインの実行が成功したかどうかは、CI/CD > Pipelines から確認できます。
表示がpassedになっていれば、成功です。

念のためS3バケットも確認し、確かにファイルがアップロードされていることを確認します。 f:id:BioErrorLog:20200308155509p:plain

見事、S3にファイルがアップロードされていることが確認できました。


Discussion

Proxy配下のGitLabから、パイプラインを用いてS3にファイルをアップロードするやり方を記録しました。

自分にとってのポイントは、GitLab PipelinesのVariablesに環境変数を渡せるという部分です。 この環境変数を介して、IAMユーザーの認証やプロキシ設定を行うことが出来ます。

これに気付かなかったために、少しの間右往左往することになりました。

世の中にはほかにも多くのパイプラインツールがあるので、色々と触ってこなれていきたいところです。


Reference

Running GitLab Runner behind a proxy | GitLab

GitLabリポジトリへのPushをトリガーにS3にファイルをアップロードする | Developers.IO