

# Lambda 関数を使用して Amazon EC2 のライフサイクルイベントを処理する
<a name="services-ec2"></a>

AWS Lambdaを使用して、Amazon Elastic Compute Cloud のライフサイクルイベントを処理し、Amazon EC2 リソースを管理します。Amazon EC2 は、インスタンスの状態が変化したとき、Amazon Elastic Block Store ボリュームのスナップショットが完了したとき、スポットインスタンスの終了が予定されているときなどの[ライフサイクルイベント](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html)において、イベントを [Amazon EventBridge (CloudWatch Events)](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) に送信します。これらのイベントを Lambda 関数に転送して処理を行うように、Eventbridge (CloudWatch Events) を設定します。

Eventbridge (CloudWatch Events) は、Amazon EC2 からのイベントドキュメントを使用して、Lambda 関数を非同期的に呼び出します。

**Example インスタンスのライフサイクルイベント**  

```
{
    "version": "0",
    "id": "b6ba298a-7732-2226-xmpl-976312c1a050",
    "detail-type": "EC2 Instance State-change Notification",
    "source": "aws.ec2",
    "account": "111122223333",
    "time": "2019-10-02T17:59:30Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ec2:us-east-1:111122223333:instance/i-0c314xmplcd5b8173"
    ],
    "detail": {
        "instance-id": "i-0c314xmplcd5b8173",
        "state": "running"
    }
}
```

イベントの設定の詳細については、「[スケジュールに従って Lambda 関数を呼び出す](with-eventbridge-scheduler.md)」を参照してください。Amazon EBS スナップショット通知を処理する関数の例については、「[EventBridge Scheduler for Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-cloud-watch-events.html)」を参照してください。

AWS SDK を使用して、Amazon EC2 API でインスタンスやその他のリソースを管理することもできます。

## EventBridge へのアクセス許可の付与 (CloudWatch Events)
<a name="services-ec2-permissions"></a>

Amazon EC2 のライフサイクルイベントを処理するには、Eventbridge (CloudWatch Events) で関数を呼び出すためのアクセス許可が必要です。このアクセス許可は、関数の[リソースベースのポリシー](access-control-resource-based.md)から取得します。Eventbridge (CloudWatch Events) コンソールを使用してイベントトリガーを設定する場合は、コンソールがユーザーに代わってリソースベースのポリシーを更新します。それ以外の場合は、次のようなステートメントを追加します。

**Example Amazon EC2 ライフサイクル通知に使用するリソースベースのポリシーステートメント**  

```
{
  "Sid": "ec2-events",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:us-east-1:12456789012:function:my-function",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events:us-east-1:12456789012:rule/*"
    }
  }
}
```

ステートメントを追加するには、`add-permission` AWS CLI コマンドを使用します。

```
aws lambda add-permission --action lambda:InvokeFunction --statement-id ec2-events \
--principal events.amazonaws.com --function-name {{my-function}} --source-arn 'arn:aws:events:us-east-1:{{12456789012}}:rule/*'
```

関数で AWS SDK を使用して Amazon EC2 リソースを管理する場合は、関数の[実行ロール](lambda-intro-execution-role.md)に Amazon EC2 アクセス許可を追加します。