LoginSignup
31
31

More than 3 years have passed since last update.

AWS CodeStarとCloud9によるPython Lambda開発

Last updated at Posted at 2018-06-27

CodeStarとは?

AWSの既存の開発ツール群をかき集めて簡単に立ち上げられるように体系化したものです。
まさにStar(ヒトデ)のようにあらゆるものをかき集めた訳ですね。
かき集められたツールは大体下記の通りです。

項目
Cloud9 ブラウザ上で動くコードエディタ(IDE)。天国超えたような至福感という意味です。これを使ってコードを書くわけですがVSCodeやテキストエディタを使用する事も可能です。
CodeCommit  Gitのリポジトリ。GitHubも使用可能です。
CloudWatch CodeCommitの変化をCodePipelineに通知するEvent通達用のツール。
CodePipeline  Gitのリポジトリへの更新をきっかけに発動するフロー管理。
CodeBuild PipeLineから起動するGitで管理されたコードのビルド。
CloudFormation Infrastructure as Code! ビルドされたものをLambda(等)にデプロイするツール。
  • Cloud9でコードを書いて
  • CodeCommitにコミット・プッシュ
  • CloudWatch経由でCodePipelineが動く
  • CodeBuildでビルド
  • ビルドが通ったらCloudFormationで実際のLambdaがデプロイされる
    簡単に(?)言うとこういう訳ですね。

そもそもCodeStarで選んだものによってデプロイの仕方が変わり、中にはCodeDeployAgentなるものを インスタンスに入れておいてデプロイするようなものもありますのでこの記事の内容は全く保証できませんが、これらの開発の実体をアジャイルで解明していきます。
尚、本稿はわかりやすくする為AWS以外のツールは使用せず、Python Lambda開発に絞っています。

何故Pythonか?

PythonはZen(禅)の思想を持っています。わかりやすくコード量が少なく書ける。同じ事に対する複数記法が少ない。特にMLの分野で多用され、シェルも脅かし始めています(Perl嫌い派に受ける)。個人的には好きです。
玉に瑕なのはバージョンが2系と3系で分かれてしまっているところでしょうか。

最初の一択

CodeStarにて、新規プロジェクトを選択し、Python のウェブサービス Lambdaを選択します。

次々に繰り出される選択肢は全て先に上げたAWSのサービスを選択します。

image.png

作成されたコードの俯瞰

概要

image.png
作成されるコードは、至極単純なものです。API Gateway経由でHTTPSのREST(GET/POST)を呼び出すと、Lambdaが動作し、index.pyのhandlerのコードが動いてHTTPのステータスコード200と、"Hello World"とtimestampの含まれたJSONをBodyに返します。

但しこのコードをCI/CDする為に作成される前出のリソースの全体像を把握するのは非常に大変です。順を追って見ていきましょう。

cloud9

image.png

Cloud9はEC2で起動したインスタンス上で動く開発環境です。
ディレクトリ構造が確認できるペイン、ソースのエディタ、インスタンスにsshでつないだコンソールで成り立っています。

インスタンスには aws コマンドやgitコマンド、dockerが導入済みです。
この環境自体もCloudFormationのtemplateで作成されます。

ec2-userでログインしており、AWSによって 現在ログインしているユーザーのクレデンシャルが ~/.aws/credentials に予め仕込まれています。このクレデンシャルはセキュリティ向上の為自動でローテーションされます。
現在ログインしているアカウント権限でawsコマンドや、pythonのboto3でのAWS用APIが実行できます。
EC2のコンソールでこのインスタンスを確認する事ができます。

テストコード

image.png
python は言語仕様としてunittestの仕組みを内包しており、unittestモジュールを使用する事によって実現できます。

python -m unittest discover というコマンドは指定されたディレクトリ配下のテスト全てを実行してくれます。

これはユニットテストですのでLambdaを実行している訳ではなく、index.py のhandler関数そのものを呼び出して戻り値等を確認しています。

CodeCommit

image.png
image.png

Cloud9環境上のコードの、GitのリポジトリがCodeCommitです。図を細かく見るとわかりますが、ファイルはCloud9にあるものと同じです。

このGitで管理されたソースがCloud9の環境にClone(ローカルコピー)されているわけです。

CloudWatch

image.png
image.png
CodeCommitのReferenceUpdateのイベントをきっかけにCodePipeLineを起動するイベントがCodeStarによって自動で設定されています。

Cloud9のコンソール上で、git commit(変更確定)し、git push(変更をCodeCommitと同期)すると、このイベントが走り出します。

CodePipeline

image.png

CodePipeLineはパイプラインに従って CodeBuildと CloudFormationを呼び出します。

CodeBuild

image.png

image.png

CodeBuildはリポジトリにあるbuildspec.ymlに従ってビルド前のユニットテストや、ビルドを行います。

ビルド時のログや履歴が一目瞭然です。

buildspec.yml


version: 0.2

phases:
  install:
    commands:

      # Upgrade AWS CLI to the latest version
      - pip install --upgrade awscli

  pre_build:
    commands:

      # Discover and run unit tests in the 'tests' directory. For more information, see <https://docs.python.org/3/library/unittest.html#test-discovery>
      - python -m unittest discover tests

  build:
    commands:

      # Use AWS SAM to package the application by using AWS CloudFormation
      - aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template template-export.yml

artifacts:
  type: zip
  files:
    - template-export.yml

buildspec.ymlでは、ビルド前に AWSClientを先にインストールし、pythonでユニットテストを行い、CloudFormationでパッケージ作成しています。

CloudFormationでは、Lambdaのデプロイ用にソースをzipにしてS3に出力し、そのzipをLambdaのCodeUriとして指し示したCloudformationのtemplate template-export.ymlを作成しています。その大元になるのがtemplate.ymlです。これはデプロイの概要を示しています。

template.yml

AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar

Parameters:
  ProjectId:
    Type: String
    Description: CodeStar projectId used to associate new resources to team members

# Enable blue/green deployments using this Globals section. For instructions, see the AWS CodeStar User Guide:
# https://docs.aws.amazon.com/codestar/latest/userguide/how-to-modify-serverless-project.html?icmpid=docs_acs_rm_tr
#
# Globals:
#   Function:
#     AutoPublishAlias: live
#     DeploymentPreference:
#       Enabled: true
#       Type: Canary10Percent5Minutes

Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: python3.6
      Role:
        Fn::ImportValue:
          !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
      Events:
        GetEvent:
          Type: Api
          Properties:
            Path: /
            Method: get
        PostEvent:
          Type: Api
          Properties:
            Path: /
            Method: post

template.ymlは、CloudFormationのテンプレートです。
AWS Serverless Application Model (SAM)によって記述されています。CloudFormationでAPI GatewayやLambdaのリソースをつらつら書くのを簡略化して、AWS::Serverless::Functionを書くだけでAPI GatewayとLambdaが両方作成されるものと考えてください。

デプロイ

image.png

CloudFormationには、変更セット(ChangeSet)というものがあります。元々のtemplateはそのままに、ChangeSetをtemplateに加えて実行する事で、デプロイ資源等の情報を新しくしてtemplateを実行する事ができます。 上図は先程のCodePipelineのDeploy部分を編集モードにした図ですが、ここでビルド時に出力したテンプレートを指定する事により、資源がデプロイされる事になります。

Pipelineの次のプロセス、ExecuteChange側で変更したtemplateを実行します。

CloudFormation

image.png

CloudFormationのコンソールにて、作成されたリソースを確認する事ができます。

  • awscodestar-pytest-lambda がLambdaを作成するtemplate
  • aws-cloud9-pytest-a943~ がcloud9の環境を整備するtemplate
  • awscodestar-pytest がCodestar全体を整備するtemplate  となりますので、 デプロイに失敗した場合は一番上のtemplateのエラーメッセージを確認する事で失敗の原因を探る事ができます。

Deploy成果の確認

Lambda

image.png
作成されたLambdaは、単体でコンソールからテストできます。

API Gateway

image.png
こちらはAPI Gatewayです。同じくHTTP呼び出しにてテストできます。

呼び出し

image.png
ステージングしてデプロイしたAPIは、ブラウザ等でテストできます。

長旅の終わりに

CodeStarコンソール!!

image.png
ここまでつらつらと関連するリソースに関して解説してきましたが、それらの全てを呼び出せるタイル形式のダッシュボードがCodeStar コンソールです。

なかなか大変ですね。

参考

SAM関連

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/serverless-deploy-wt.html#serverless-pack
https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html
https://github.com/awslabs/serverless-application-model

31
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
31