ค้นหาเว็บไซต์

typescript - ไม่สามารถดึงค่าจาก context provider ami ได้เนื่องจากไม่ได้ระบุบัญชี/ภูมิภาคที่ระดับสแตก


สวัสดี ฉันมีปัญหาเมื่อฉันพยายามสร้างสแตกบน AWS CDK

    import * as cdk from '@aws-cdk/core';
    import ec2 = require('@aws-cdk/aws-ec2');
    import { SubnetType } from '@aws-cdk/aws-ec2';

    export class FirstDemoStack extends cdk.Stack {
      constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        const natGatewayProvider = ec2.NatProvider.instance({
          instanceType: new ec2.InstanceType('t3.micro')
        });

        const vpc = new ec2.Vpc(this, 'VPC_Test', {
          cidr: '10.0.0.0/26',
          maxAzs: 1,
          subnetConfiguration:[
            {
              subnetType: ec2.SubnetType.PUBLIC,
              name: 'Ingress',
              cidrMask: 28
            },
            {
              cidrMask: 28,
              name: 'Application',
              subnetType: ec2.SubnetType.PRIVATE
            }
          ],
          natGatewayProvider,
          natGateways:2,
        });
      }
    }

ดังนั้นฉันจึงได้รับข้อผิดพลาดต่อไปนี้

    Cannot retrieve value from context provider ami since account/region are not specified at the stack level. Either configure "env" with explicit account and region when you define your stack, or use the environment variables "CDK_DEFAULT_ACCOUNT" and "CDK_DEFAULT_REGION" to inherit environment information from the CLI (not recommended for production stacks)

ฉันรู้ว่าฉันต้องเพิ่มภูมิภาคและบัญชีไปยังสแต็กของฉัน แต่ฉันไม่รู้ว่าจะเริ่มตรงไหน

คำตอบ #1

ถ้าเราวิเคราะห์ข้อผิดพลาด จะบอกว่าการหาภาพ AMI ที่เหมาะสมสำหรับอินสแตนซ์ EC2 ของคุณ จำเป็นต้องตั้งค่า region/account มีหลายวิธีในการทำสิ่งนี้

1) แนะนำ ตั้งค่าข้อมูลเมื่อคุณสร้างสแต็ก

ในไฟล์ index.ts ของคุณ คุณจะพบการเรียก new FirstDemoStack(...) คุณจำเป็นต้องแก้ไขให้รวมตัวแปรสภาพแวดล้อมบางตัว นี่คือสถานที่ที่คุณสามารถตั้งค่าบัญชีและภูมิภาคของคุณได้

new FirstDemoStack(app, 'first-demo-stack', { env: {
  account: 'your-account-number',
  region: 'us-east-1' // or whatever region you use
}});

2) คุณสามารถตั้งค่าได้ในตัวแปรสภาพแวดล้อมของคุณ

คุณจะต้องตั้งค่า CDK_DEFAULT_ACCOUNT และ CDK_DEFAULT_REGION ให้เป็นค่าของมันตามลำดับ คุณ สามารถ ใช้สิ่งนี้ได้ แต่ถ้าคุณต้องการใช้สองภูมิภาคหรือสองบัญชี คุณจะต้องเขียนค่าพวกนี้แบบตั้งเป็นค่าคงที่

คำตอบ #2

คุณจำเป็นต้องกำหนดตัวแปรแวดล้อมในระดับสแตก ดังนั้นมันจะดูเหมือนแบบนี้:

import * as cdk from '@aws-cdk/core';
import ec2 = require('@aws-cdk/aws-ec2');
import { SubnetType } from '@aws-cdk/aws-ec2';

require("dotenv").config();

const config = {
  env: {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: process.env.CDK_DEFAULT_REGION,
  },
};

export class FirstDemoStack extends cdk.Stack {
      constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        // Required to change here.
        // super(scope, id, props);
        super(scope, id, { ...props, env: config.env });

        const natGatewayProvider = ec2.NatProvider.instance({
          instanceType: new ec2.InstanceType('t3.micro')
        });

        const vpc = new ec2.Vpc(this, 'VPC_Test', {
          cidr: '10.0.0.0/26',
          maxAzs: 1,
          subnetConfiguration:[
            {
              subnetType: ec2.SubnetType.PUBLIC,
              name: 'Ingress',
              cidrMask: 28
            },
            {
              cidrMask: 28,
              name: 'Application',
              subnetType: ec2.SubnetType.PRIVATE
            }
          ],
          natGatewayProvider,
          natGateways:2,
        });
      }
    }

บทความที่เกี่ยวข้อง