はじめに
自分用のメモとして作りました
python 3.8 の hello world を返す lambda を2つリリースします
手順
- githubのリポジトリをフォークする
- AWSのマネジメントコンソールでパイプラインを作る
- lambdaがリリースされるのを確認する
注意
CodePipelineは従量制の課金です!
無料枠でも100回を越えると課金されます
前提
AWSのアカウントがあること
githubのアカウントがあること
詳細
1. githubのリポジトリをフォークする
githubにログインして、赤線の所をクリックするとforkできます
https://github.com/lnsw/sample-lambda-release
2. AWSのマネジメントコンソールでパイプラインを作る
下記の6つのステップがあります
- 新規のパイプラインを作成する
- ソースステージを追加する
- ビルドステージを追加する
- デプロイステージを追加する
- レビュー
- 調整
1. 新規のパイプラインを作成する
https://us-west-1.console.aws.amazon.com/codesuite/codepipeline/pipeline/new?region=us-west-1 (このリンクは北カルフォルニアです)
2.ソースステージを追加する
ソースは github になります
- GitHub (Version 1) を選択します
- GitHubに接続は、説明を省いてすいませんがなんとかうまいぐあいにやってください
- リポジトリはフォークした自分のsample-lambda-release を選択
- ブランチは master を選択
- 次にを押します
3. ビルドステージを追加する
ここはプロジェクトの設定もあって少し長いです
- AWS CodeBuild を選択します
- リージョンは自動で入ります
- プロジェクト名は、プロジェクトを作成するを押して別のウィンドウに移ります
プロジェクトの設定
環境
よくわからないですが最新のを選択するようです
- マネージド型イメージ
- ubuntu
- Standard
- aws/codebuild/standard:4.0
- aws/codebuild/standard:4.0-20.09.14 (最新の)
Buildspec、バッチ設定、ログ
パイプラインの作成に戻ってきます
- S3バケットを1つ作ります。名前は何でもいいです。例)sample-lambda-release-backet-(ユーザー名)等(※1)
- 環境変数 - オプショナル で環境変数の追加を押します
- それから S3_ARTIFACT_BUCKET と作ったバケット名を入力します
- 次に を押します
4. デプロイステージを追加する
- デプロイステージの前にIAMでパイプライン用のロールを1つ作ります
- ロールの作成 で ユースケースの選択でCloudFormationを選ぶ
- Attach アクセス権限ポリシー で 4つのポリシーを
AWSCloudFormationFullAccess
AWSLambdaFullAccess
AmazonAPIGatewayAdministrator
IAMFullAccess
をアタッチします (とりあえず動かすのを優先のためで、正式に利用するなら適切な権限にします) - 名前はsample-lambda-release-deploy-role として作成する
- デプロイステージに戻って デプロイプロバイダーに AWS Cloudformatin を選択します
- アクションモードは スタックを作成または更新する を選びます
- スタック名は sample-lambda-release
- テンプレートのアーティファクトは BuildArtifact 、ファイル名は packaged.yml を入力します
- 能力 - オプショナル は3つ選びます。CAPABILITY_IAM 、 CAPABILITY_NAMED_IAM 、 CAPABILITY_AUTO_EXPAND
- ロール名は、さきほど作ったパイプライン用のロールのARNを入力します(画面を表示した後に作ったロールは選択できないっぽいです)
- 次に を押します
5. レビュー
- パイプラインを作成する を押します
6. 調整
このままだとビルドステージでエラーになるので1つ修正をします
こんなエラーです
Error: Unable to upload artifact hello_world/ referenced by CodeUri parameter of HelloWorldFunction resource.
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
ビルドステージのロールの権限
ビルドステージで新規のロールを作成しましたが(sample-lambda-release で絞るとでてきます)
IAMでこのロールに「AmazonS3FullAccess」をアタッチします
(とりあえずリリースできる事を優先しました。※1で作ったS3バケットへの権限だけで設定するのが安全です)
こんな感じ
{
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::codepipeline-us-west-1-*",
"arn:aws:s3:::sample-lambda-release-backet-(ユーザー名)等",
"arn:aws:s3:::sample-lambda-release-backet-(ユーザー名)等/*"
],
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetBucketAcl",
"s3:GetBucketLocation"
]
},