AWS GitHubと連携したCodePipelineでの自動Lambda関数のデプロイ

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

CodePipelineはGithubのpushイベントをウォッチし、ブランチにプッシュ後自動でbuild & deployすることが出来ます。


CodeBuildの設定

GitHubで管理しているプロジェクトのBulidの実行環境構成を記述します。

build-project.json

{
  "timeoutInMinutes": 60,
  "name": "serverless-pipeline",
  "serviceRole": "your-codebuild-role",
  "tags": [],
  "artifacts": {
    "packaging": "NONE",
    "type": "CODEPIPELINE",
    "name": "serverless-pipeline"
  },
  "cache": {
    "type": "NO_CACHE"
  },
  "environment": {
    "computeType": "BUILD_GENERAL1_SMALL",
    "privilegedMode": false,
    "image": "aws/codebuild/python:3.5.2",
    "type": "LINUX_CONTAINER",
    "environmentVariables": []
  },
  "source": {
    "insecureSsl": false,
    "type": "CODEPIPELINE"
  }
}

serviceRoleには、s3cloudwatchlogCodeBuildへのssm:GetParametersのpermissionを与えます。緩めのポリシーでよければ、AWSCodeBuildAdminAccessを付与したロールを指定すればよい。

また、build settingに関してはbuildspec.yamlに記述し、GitHub上に配置しておきます。


CodeBuildプロジェクトの作成
$ aws codebuild create-project --cli-input-json file://build-project.json


buildspec.yaml

buildspec.yamlはGitHub上のリポジトリ最上位にpushするsettingファイル。このsettingをCodeBuildは実行してbuildを行います。

ステップ 3: buildspec ファイルを作成する - AWS CodeBuild

version: 0.1
phases:
  install:
    commands:
      - pip3 install boto3
      - aws cloudformation package --template-file sample-sam.yaml --s3-bucket your-output-bucket --output-template-file sample-sam-output.yaml
artifacts:
  type: zip
  files:
    - sample-sam-output.yaml

sample-sam.yamlはcloudformationのスタックの定義。


CodePipelineプロジェクトの作成

pipeline.json

{
  "pipeline": {
    "roleArn": "your-pipelinerole",
    "stages": [
      {
        "name": "Source",
        "actions": [
          {
            "inputArtifacts": [],
            "name": "Source",
            "actionTypeId": {
              "category": "Source",
              "owner": "ThirdParty",
              "version": "1",
              "provider": "GitHub"
            },
            "outputArtifacts": [
              {
                "name": "MyApp"
              }
            ],
            "configuration": {
              "Owner": "your-github-user-name",
              "Repo": "your-github-repository-name",
              "PollForSourceChanges": "true",
              "Branch": "master",
              "OAuthToken": "****"
            },
            "runOrder": 1
          }
        ]
      },
      {
        "name": "Build",
        "actions": [
          {
            "inputArtifacts": [
              {
                "name": "MyApp"
              }
            ],
            "name": "CodeBuild",
            "actionTypeId": {
              "category": "Build",
              "owner": "AWS",
              "version": "1",
              "provider": "CodeBuild"
            },
            "outputArtifacts": [
              {
                "name": "MyAppBuild"
              }
            ],
            "configuration": {
              "ProjectName": "serverless-pipeline"
            },
            "runOrder": 1
          }
        ]
      },
      {
        "name": "Staging",
        "actions": [
          {
            "inputArtifacts": [
              {
                "name": "MyAppBuild"
              }
            ],
            "name": "MyBetaStack",
            "actionTypeId": {
              "category": "Deploy",
              "owner": "AWS",
              "version": "1",
              "provider": "CloudFormation"
            },
            "outputArtifacts": [],
            "configuration": {
              "ActionMode": "CHANGE_SET_REPLACE",
              "ChangeSetName": "MyBetaChangeSet",
              "RoleArn": "your-cloudformation-role",
              "Capabilities": "CAPABILITY_IAM",
              "StackName": "MyBetaStack",
              "TemplatePath": "MyAppBuild::sample-sam-output.yaml"
            },
            "runOrder": 1
          },
          {
            "inputArtifacts": [],
            "name": "Execute_ChangeSet",
            "actionTypeId": {
              "category": "Deploy",
              "owner": "AWS",
              "version": "1",
              "provider": "CloudFormation"
            },
            "outputArtifacts": [],
            "configuration": {
              "StackName": "MyBetaStack",
              "ActionMode": "CHANGE_SET_EXECUTE",
              "ChangeSetName": "MyBetaChangeSet"
            },
            "runOrder": 2
          }
        ]
      }
    ],
    "artifactStore": {
      "type": "S3",
      "location": "your-s3-bucket-of-buildpackage"
    },
    "name": "serverless-pipeline"
  }
}

roleArnにはpipelineに許可するロールを。緩めで良いのであれば、AWSCodePipelineFullAccessのポリシーをアタッチしたロールを指定するのが手取り早い。


Sourceセクション

ウォッチするGitHubの定義を記述します。OAuthTokenは対象のGitHubアカウントのDeveloper settingで取得します。


Buildセクション

Sourceセクションでの成果物、Artifactsを受け取り、上記で作成したCodeBuidのProjectNameを指定する。


Stagingセクション

Buildでの成果物をデプロイするセクション。上記例ではCloudFormationでのデプロイを定義しています。

cloudformationのroleは、デプロイ対象となるLambda、DynamoDBなどのサービスについての操作ポリシーを設定したロールを与える。


artifactStore

各セクションでの成果物を保存するS3 Bucketを指定します。

codepipelineの作成
$ aws codepipeline create-pipeline --cli-input-json file://pipeline.json

コマンド実行後、まず最初に一度デプロイされ、GitHubリポジトリにプッシュされる度、デプロイが実行されます。