【CICD】Gitlab CICDを利用してAWS CodecommitへPushする

aws
やりたいことの全体像

 GitLabとAWS CodeCommit両方にリポジトリを持ち、GitLabとAWS CodeCommitを連携したい場合があると思います。ただ、ソースとターゲットのブランチ名が異なり、リポジトリミラーリングを利用できない際に、以下の方法でもっと自由に連携できます。
 ・GitLab の .gitlab-ci.ymlにあるscriptを利用して、連携するブランチを指定します。

実施手順

【AWS側の作業】

①IAMポリシー作成
 IAMから以下をコピペしてIAMポリシーを作成します。ポリシー名は「GITLAB_CODECOMMIT_SYNC_POLICY」とします。
 <AWS アカウント ID>、<CodeCommit リポジトリ名>はそれぞれ書き換えて設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:GitPull",
                "codecommit:GitPush"
            ],
            "Resource": "arn:aws:codecommit:ap-northeast-1:<AWS アカウント ID>:<CodeCommit リポジトリ名>"
        }
    ]
}

 社内GitLab利用して、セキュリティ要件でIPを制限したい場合は以下のポリシーも作成します。ポリシー名は「GITLAB_IPBLOCKING_POLICY」とします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "***.***.***.***/32",
                        "***.***.***.***/32"
                    ]
                }
            },
            "Resource": "*"
        }
    ]
}

②IAMユーザーの作成
 IAMから新しいユーザを作成します。Step①で作成したIAMポリシーをアタッチします。

③AWS CodeCommitの認証情報を作成
 Step②で作成したIAMユーザーの「セキュリティ認証情報」タブを選択し、「AWS CodeCommitのHTTPS Git 認証情報」から「認証情報を生成」を押下します。生成された認証情報をローカルに保存します。

【GitLab側の作業】

①CIDI変数追加

 GitLab側で、対象のリポジトリを選択して、[設定] > [CI/CD] を開きます。[変数] を展開し、[変数の追加] をクリックします。AWS Codecommitのgit認証情報を以下のように変数として追加します。

 ・ユーザID
 Key: CODE_COMMIT_USER
 Value:上記取得したAWS Codecommitのgit認証情報のユーザ名
 ・パスワード
 Key: CODE_COMMIT_PW
 Value:上記取得したAWS Codecommitのgit認証情報のパスワード
 ※パスワードはシークレット情報としてログに出力させたくない場合は「Mask variable」Flagsをチェックしましょう。

Flagsの「Protect variable」をチェックすると、定義した変数は「protected」タグが付くブランチ(デフォルトはmainブランチ)しか利用できなくなります。すべてのブランチで変数を利用したい場合は「Protect variable」のチェックを外す必要があります。


②「.gitlab-ci.yml」ファイル作成
 新しいプロジェクトを作成して、ルートディレクトリの直下に「.gitlab-ci.yml」ファイルを追加して、以下の内容を記載します。以下はGitLab側のenvブランチからAWS CodeCommit側のmainブランチへPushとします。

stages:          
  - stage1
  - stage2

#必要に応じて修正
stage1-job:       
  stage: stage1
  script:
    - echo "Do something in stage1..."
    - echo "Stage1 complete."
  tags:
    - gitlab-runner



#GitLabからAWS Codecommitへの連携
stage2-job:
    stage: stage2
  #ここのimageはDocker Hubから取得しますが、必要に応じて取得場所を指定することができます。
    image: gittools/gitversion
    script:
        - echo "sync_to_codecommit..."
        - git remote -v
        - git checkout -b env origin/env
        #originをAWS Codecommitのリポジトリに設定します。
        #${CODE_COMMIT_USER}と${CODE_COMMIT_PW}はGitLabで設定されたCICD変数を指します。
        - git remote set-url origin https://${CODE_COMMIT_USER}:${CODE_COMMIT_PW}@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/<Codecommitリポジトリ名>
        - git remote -v
        #ローカル(GitLab)のenvブランチからリモート(AWS Codecommit)のmainへpushします。
        - git push -uf origin env:main
    rules:
        #envへマージする際にstage2-jobブロックを実行します。
        - if: '$CI_COMMIT_BRANCH == "env"'
    tags:
        #使用したいGitlab runnerのtagを指定します。
        - gitlab-runner

コメント

タイトルとURLをコピーしました