ラインを作成します。インスタンスタイプに応じて Amazon Linux オプションを選択します。パイプ ラインには任意の名前を使用できますが、このトピックの手順では MyLambdaTestPipeline を使用し ています。
2. パイプラインのステータスページの [AWS CodeDeploy アクション] で、[詳細] を選択します。デプロ イグループのデプロイの詳細ページで、リストからインスタンス ID を選択します。
3. Amazon EC2 コンソールのインスタンスの [Description (説明)] タブで、[パブリック IP] の IP アドレ ス (192.0.2.4 など) をコピーします。このアドレスを AWS Lambda で関数のターゲットとして使用 します。
Note
AWS CodePipeline のデフォルトサービスロールである AWS-CodePipeline-Service は、関数を呼 び出すために必要な Lambda アクセス権限を含むため、追加の呼び出しポリシーやロールを作成 する必要はありません。ただし、デフォルトサービスロールを変更、または別のものを選択した 場合、ロールのポリシーが lambda:InvokeFunction および lambda:ListFunctions 権限を 許可していることを確認してください。そうしない場合、Lambda アクションを含むパイプライ ンは失敗します。
ステップ 2: Lambda 関数を作成する
このステップでは、HTTP リクエストを生成し、ウェブページ上のテキスト行をチェックする Lambda 関 数を作成します。このステップの一環として、IAM ポリシーおよび Lambda 実行ロールを作成する必要が あります。詳細については、AWS Lambda 開発者ガイドの「アクセス権限モデル」を参照してください。
実行ロールを作成するには
1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/
iam/)を開きます。
2. [Policies] を選択してから、[Create Policy] を選択します[JSON] タブを選択して、次のポリシーを フィールドに貼り付けます。
{ "Version": "2012-10-17", "Statement": [
{
"Action": [ "logs:*"
],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*"
}, {
"Action": [
"codepipeline:PutJobSuccessResult", "codepipeline:PutJobFailureResult"
],
"Effect": "Allow", "Resource": "*"
} ] }
3. [ポリシーの確認] を選択します。
4. [ポリシーの確認] ページで、[名前] に、ポリシー名 (CodePipelineLambdaExecPolicy など) を入 力します。[説明] で Enables Lambda to execute code を入力します。
[Create Policy] を選択します。
ステップ 2: Lambda 関数を作成する
Note
これらは、Lambda 関数が AWS CodePipeline および Amazon CloudWatch とやり取りす るために必要な最小限のアクセス権限です。このポリシーを拡張して、関数が他の AWS リ ソースとやり取りできるようにする場合は、このポリシーを変更して、それらの Lambda 関 数に必要なアクションを許可する必要があります。
5. ポリシーダッシュボードページで、[ロール]、[ロールの作成] の順に選択します。
6. [ロールの作成] ページで、[AWS service (AWS のサービス)] を選択します。[Lambda] を選択し、
[Next: Permissions (次へ: アクセス許可)] を選択します。
7. [アクセス許可ポリシーをアタッチする] ページで、[CodePipelineLambdaExecPolicy] の横にある チェックボックスをオンにし、[Next: Review(次へ: 確認)] を選択します。
8. [確認] ページの、[ロール名] で名前を入力し、[ロールの作成] を選択します。
AWS CodePipeline で使用するサンプル Lambda 関数を作成するには
1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/lambda/ にある AWS Lambda コンソールを開きます。
2. [関数] ページで、[関数の作成] を選択します。
Note
Lambda ページの代わりに [ようこそ] ページが表示された場合は、[今すぐ始める] を選択し ます。
3. [Create function] ページで、[Author from scratch] を選択します。[名前] に、Lambda 関数の名前を入 力します (たとえば、MyLambdaFunctionForAWSCodePipeline)。[説明] に関数のオプションの 説明を入力します (たとえば、A sample test to check whether the website responds with a 200 (OK) and contains a specific word on the page)。[ランタイム] で、
[Node.js 6.10] を選択し、以下のコードを [Function code (関数コード)] ボックスにコピーします。
Note
CodePipeline.job キーの下にあるイベントオブジェクトには、ジョブの詳細が含まれま す。AWS CodePipeline が Lambda に返す JSON イベントの完全な例については、「JSON イベントの例 (p. 163)」を参照してください。
var assert = require('assert');
var AWS = require('aws-sdk');
var http = require('http');
exports.handler = function(event, context) { var codepipeline = new AWS.CodePipeline();
// Retrieve the Job ID from the Lambda action var jobId = event["CodePipeline.job"].id;
// Retrieve the value of UserParameters from the Lambda action configuration in AWS CodePipeline, in this case a URL which will be
// health checked by this function.
var url =
event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters;
// Notify AWS CodePipeline of a successful job var putJobSuccess = function(message) { var params = {
jobId: jobId };
codepipeline.putJobSuccessResult(params, function(err, data) {
ステップ 2: Lambda 関数を作成する
if(err) {
context.fail(err);
} else {
context.succeed(message);
} });
};
// Notify AWS CodePipeline of a failed job var putJobFailure = function(message) { var params = {
jobId: jobId, failureDetails: {
message: JSON.stringify(message), type: 'JobFailed',
externalExecutionId: context.invokeid }
};
codepipeline.putJobFailureResult(params, function(err, data) { context.fail(message);
});
};
// Validate the URL passed in UserParameters if(!url || url.indexOf('http://') === -1) {
putJobFailure('The UserParameters field must contain a valid URL address to test, including http:// or https://');
return;
}
// Helper function to make a HTTP GET request to the page.
// The helper will test the response and succeed or fail the job accordingly var getPage = function(url, callback) {
var pageObject = { body: '', statusCode: 0,
contains: function(search) {
return this.body.indexOf(search) > -1;
} };
http.get(url, function(response) { pageObject.body = '';
pageObject.statusCode = response.statusCode;
response.on('data', function (chunk) { pageObject.body += chunk;
});
response.on('end', function () { callback(pageObject);
});
response.resume();
}).on('error', function(error) {
// Fail the job if our request failed putJobFailure(error);
});
};
getPage(url, function(returnedPage) { try {
// Check if the HTTP response has a 200 status assert(returnedPage.statusCode === 200);
// Check if the page contains the text "Congratulations"
// You can change this to check for different text, or add other tests as required
ステップ 3: AWS CodePipeline コンソー ルのパイプラインへの Lambda 関数の追加
assert(returnedPage.contains('Congratulations'));
// Succeed the job
putJobSuccess("Tests passed.");
} catch (ex) {
// If any of the assertions failed then fail the job putJobFailure(ex);
} });
};
4. [Role (ロール)] で、[既存のロールを選択] を選択します。[Existing role (既存のロール)] でロールを選 択し、[Create function (関数の作成)] を選択します。
5. [Handler (ハンドラ)] はデフォルト値のままにし、[Role (ロール)] もデフォルトの CodePipelineLambdaExecRole のままにします。
6. [基本設定] で [タイムアウト] で、[20] を選択します。
7. [Save] を選択します。