前提条件

AWS CodePipelineを使用して、ステージング環境でCloudFormationスタックを通じてLambda関数を作成するプロセスを解説します。以下の準備が必要です:

  1. Lambda CodePipeline用のIAMロール
  2. コードが保存されているリポジトリ(Git、CodeCommit、BitBucketなど)
    • テンプレートファイル、コード、buildspecファイルを含む

GUIを使用したパイプライン作成手順

1. IAMロールの作成

  1. AWSコンソールにログインし、IAMに移動します。
  2. パイプライン用の統一されたロールを作成します。例: LambdaDeploySTGRole
  3. このロールには以下のような権限を含めます:
    • CodeCommit/Git: GitPull、GetBranchなど
    • CodeBuild: StartBuild、CreateReportなど
    • CloudFormation: CreateStack、UpdateStackなど
    • Lambda: CreateFunction、iamPassRoleなど
  4. 必要に応じてロール定義を調整してください。

2. CodePipelineの作成

  1. AWS CodePipelineに移動し、「Create Pipeline」を選択します。
  2. 適切な名前を入力(例: LambdaDeploySTG)。
  3. 実行モードを選択します:
    • Queued: 完了まで1つの実行のみ許可。
    • Superseded: 古い実行を上書き。
    • Parallel: 実行中のものに関係なく新しい実行を開始。
  4. 作成済みのIAMロールを入力。必要に応じて環境変数を指定します(例: ステージング用の環境変数)。
  5. デフォルトのArtifact Bucketを使用する場合、詳細設定はスキップ可能です。

3. ソースプロバイダーの選択

  1. ソースプロバイダーを選択(コードが保存されているリポジトリを指定)。
  2. 推奨される検出オプションを保持(コード変更時にパイプラインが自動トリガー)。

4. ビルドプロバイダーの設定

  1. CodeBuildを選択(パイプラインと同じリージョン内)。
  2. 「Create Project」を選択し、新しいビルドプロジェクトを作成します(例: LambdaDeploySTGBuildProject)。
  3. IAMロールを調整し、プロジェクト名をリソース名に使用します。
  4. Single BuildまたはBatch Buildを選択:
    • 小規模デプロイの場合はSingle Build推奨。
    • 本番デプロイではBatch Buildを使用し、Lambda関数作成の時間を短縮。

5. デプロイステージの追加

  1. デプロイステージではCloudFormationを使用。
  2. Deploy Stageの入力には、Build Stageで生成されたBuildArtifactを指定。
  3. アクションモードを選択:
    • Create or replace a change set: 本番リリース前に変更をプレビュー。
    • Create and update a stack: 変更を即時リリース(ステージング向け)。
    • 本例では「Create and update a stack」を使用。
  4. スタックが未作成の場合、スタック名の入力を省略可能(パイプラインが自動生成)。
  5. テンプレートの指定: BuildArtifactからテンプレートを選択し、リポジトリ内のtemplate.yamlを指定。
  6. CAPABILITY_IAMを追加して、必要に応じてIAMリソースを作成できるようにします。
  7. 「Configure automatic rollback on stage failure」をチェックして自動ロールバックを設定。
  8. 設定を確認し、「Create Pipeline」を選択。

パイプラインはリポジトリの内容に基づいて自動的に実行され、CodePipelineの「Pipelines」タブで進行状況を追跡できます。

一般的なエラーと解決策

  1. Deploy Stageでの失敗
    • template.yamlの値が正しくない可能性あり。ロールやファイル名が正しいか確認(大文字・小文字を区別)。
    • IAM権限不足でCloudFormationが実行できない場合があります。
  2. Build Stageでの失敗
    • buildspec.yamlファイルの内容が計画と一致していない可能性。内容を確認し、正確な値を入力。
    • CodeBuild実行権限不足の場合もあります。
  3. Source Stageでの失敗
    • リポジトリへのアクセス権が不足している可能性あり。IAMロールを確認し、CodeCommitのリソースが正しいか確認。
  4. CloudFormationリソースの作成失敗
    • template.yamlの形式が期待通りでない可能性。CloudFormationで生成されたエラーログを確認し、テンプレートを修正。

Pipeline例

Example role for the pipeline:

{
    “Version”: “2012-10-17”,
    “Statement”: [
        {
            “Effect”: “Allow”,
            “Action”: [
                “codecommit:GetBranch”,
                “codecommit:GetCommit”,
                “codecommit:GitPull”,
                “codecommit:ListBranches”,
                “codecommit:ListRepositories”,
                “codecommit:DescribeRepository”
            ],
            “Resource”: “arn:aws:codecommit:REGION:ACCOUNT_ID:REPO_NAME”
        },
        {
            “Effect”: “Allow”,
            “Action”: [
                “codebuild:StartBuild”,
                “codebuild:BatchGetBuilds”,
                “codebuild:BatchGetProjects”,
                “codebuild:ListBuildsForProject”,
                “codebuild:CreateReportGroup”,
                “codebuild:CreateReport”,
                “codebuild:UpdateReport”,
                “codebuild:UpdateProject”
            ],
            “Resource”: “arn:aws:codebuild:REGION:ACCOUNT_ID:project/PROJECT_NAME” *パイプライン中に作成*
        },
        {
            “Effect”: “Allow”,
            “Action”: [
                “cloudformation:CreateStack”,
                “cloudformation:UpdateStack”,
                “cloudformation:DeleteStack”,
                “cloudformation:DescribeStacks”,
                “cloudformation:DescribeStackResources”,
                “cloudformation:ListStacks”,
                “cloudformation:GetTemplate”,
                “cloudformation:ValidateTemplate”,
                “cloudformation:CreateChangeSet”,
                “cloudformation:ExecuteChangeSet”,
                “cloudformation:DeleteChangeSet”
            ],
            “Resource”: “*”
        },
        {
            “Effect”: “Allow”,
            “Action”: [
                “lambda:CreateFunction”,
                “lambda:UpdateFunctionCode”,
                “lambda:InvokeFunction”,
                “lambda:DeleteFunction”,
                “iam:PassRole”,
                “logs:CreateLogGroup”,
                “logs:CreateLogStream”,
                “logs:PutLogEvents”,
                “apigateway:POST”,
                “apigateway:GET”
            ],
            “Resource”: “*”
        }
    ]
}

まとめ

AWS CodePipelineを活用したLambda作成は、ステージング環境でのテストとデプロイの効率を大幅に向上させる強力な方法です。GUIを使用してパイプラインを作成することで、複雑なプロセスをシンプルにし、信頼性の高いワークフローを実現できます。

エラーが発生した場合でも、上記の手順を参考に問題を特定し解決することで、スムーズなデプロイを実現しましょう。CodePipelineを活用して、モダンで効率的な開発環境を構築してください!