[AWS] CloudWatch AlarmからLambdaが起動されない

  • CloudWatch AlarmからLambdaを起動したいが動作しない
  • Lambda単体のテストでは動作しているため、CloudWatch Alarmからの起動が失敗している可能性が考えられる

この場合に落とし穴になりやすいのが、CloudWatch Alarmからの操作をLambdaが受け付けるようにポリシーを設定していないという点です。具体的には以下の手順で設定を行います。

  1. AWSコンソールで設定したいLambdaを選択する
  2. Configurationタブ > PermissionsメニューからResource-based policy statementsにpermissionを追加する
  3. Edit policy statementで以下の内容で登録する
    • AWS accountを選択
    • Statement ID : 任意の値を設定する
    • Principal : lambda.alarms.cloudwatch.amazonaws.com
    • Action : lambda:InvokeFunction

以上の設定を行えば無事CloudWatch AlarmからLambdaが起動されるようになります。なお、Lambdaに関する以下のような記事も公開していますので、必要に応じてご参考にしてみてください。

[AWS] Lambdaからプライベートサブネット内のEC2を起動・停止する

  • Lambdaを用いてプライベートサブネット内のEC2の起動・停止を操作したい

ポイントはセキュリティグループ、ポリシー/ロール、そしてLambdaの配置場所です。

  1. セキュリティグループの設定
  2. ポリシー/ロールの設定
  3. Lambdaの配置場所

1. セキュリティグループの設定

セキュリティグループは、①EC2のセキュリティグループ、②Lambdaのセキュリティグループの2つが必要になります。Inbound rules、Outbound rulesは以下の通りです。

①EC2のセキュリティグループ

  • Inbound rules : ②LambdaのセキュリティグループからのHTTPS(443)を許可する
  • Outbound rules : デフォルト設定(全通信許可)

②Lambdaのセキュリティグループ

  • Inbound rules : デフォルト設定(通信無し)
  • Outbound rules : デフォルト設定(全通信許可)

2. ポリシー/ロールの設定

Lambdaに AmazonEC2FullAccess ポリシーを持つロールを設定します。

3. Lambdaの配置場所

これが少し混乱する箇所かと思いますが、VPC外に配置しておけば問題ありません。つまり、VPCおよびプライベートサブネットへのアタッチは不要ということです。これは「EC2 APIがインターネット上に存在する」ということが理由です。

以上の3点に注意すれば無事Lambdaからプライベートサブネット上のEC2の起動・停止操作が可能になると思います。

[AWS] EC2からECRへ接続できない

  • プライベートサブネット内のEC2からECRに接続したい
  • エンドポイント、セキュリティグループ、IAMロール/ポリシーは正しく設定している
  • それなのにaws ecr get-login-passwordすら成功せず、そもそもECRに接続できていない状態

タイトルのような内容で検索すると、以下の1〜3の項目についてはすぐに出てくると思いますので、この3つについては簡単に触れるだけにしています。

  1. VPCエンドポイントを設定する
  2. セキュリティグループを設定する
  3. IAMロール/ポリシーを設定する
  4. DNS名でVPCエンドポイントに接続できるようにする

1. VPCエンドポイントを設定する

設定が必要なVPCエンドポイントは以下の2つです。

  • Service Name : com.amazonaws.ap-northeast-1.ecr.api
  • Service Name : com.amazonaws.ap-northeast-1.ecr.dkr

2. セキュリティグループを設定する

  • Inbound rules : Type = HTTPS, Source = sg-ec2(EC2用セキュリティグループ)
    • EC2からVPCエンドポイントへの通信を許可するようにします

■EC2用のセキュリティグループ (Ex. sg-ec2)

  • Inbound rules : Type = HTTPS, Source = sg-vpc-endpoint(VPCエンドポイント用セキュリティグループ)
    • VPCエンドポイントからEC2への通信を許可するようにします

3. IAMロール/ポリシーを設定する

AmazonEC2ContainerRegistryReadOnlyポリシーを設定したIAMロールをEC2インスタンスに付与します。

4. DNS名でVPCエンドポイントに接続できるようにする

1~3までの内容は調べればすぐに出てくると思いますが、こちらの内容が意外と出てこなくてハマりやすいポイントになるかと思います。

設定することは「VPC内のリソースがプライベートDNS名を使用してVPCエンドポイントにアクセスできるようにする」ということです。

具体的な手順は以下の通りです。

  1. VPCを作成したあとに、[作成したVPCを選択] > [Actions] > [Edit VPC settings] から Enable DNS hostnamesにチェックを入れる
    • Enable DNS resolutionはデフォルトでチェック済みだと思いますが念の為合わせてチェックしておいてください。
  2. VPCエンドポイントを作成するときに VPC > Additional settings > Enable DNS nameにチェックを入れる
    • こちらもデフォルトでチェック済みになっていると思いますが念の為チェックしておいて下さい。

以上の設定を行った後で、EC2内で以下を実行すれば確認・ログインが出来るはずです。

curl -v https://{AWS-ACCOUNT-ID}.dkr.ecr.{REGION}.amazonaws.com/v2/

aws ecr get-login-password --region {REGION} | docker login --username AWS --password-stdin {AWS-ACCOUNT-ID}.dkr.ecr.{REGION}.amazonaws.com