앞에 포스팅을 보면서 WebView 세팅을 해주기 바란다.

 

Local HTML 파일 까지는 어떻게 열었는데 버튼 이벤트시 Native 내장 기능이 필요해졌다. 

자바스크립트와 안드로이드 네이티브를 이용하여 아래 기능을 구현해봤다.

HTML > Native : Toast 메세지

Natvie > HTML : return을 통한 데이터를 HTML 화면 출력

 

MainActvity.java

package com.saii.webview;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    public WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = (WebView) findViewById(R.id.wv_main);

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        mWebView.addJavascriptInterface(new Object() {
            @JavascriptInterface
            public String showToast(String keyword) {
                Toast.makeText(MainActivity.this, keyword + " 키워드 입력" , Toast.LENGTH_LONG).show();
                String param1 = keyword + " return android - Saii";
                return param1;
            }
        }, "Saii");
        mWebView.loadUrl("file:///android_asset/index.html");

    }
}

참고

https://github.com/saii42/android/tree/main/example/WebView

 

GitHub - saii42/android: android

android. Contribute to saii42/android development by creating an account on GitHub.

github.com

https://developer.android.com/guide/webapps/webview#UsingJavaScript

 

WebView에서 웹 앱 빌드  |  Web Apps  |  Android Developers

You can test your app against unreleased future versions of WebView. Get started now!. WebView에서 웹 앱 빌드 웹 애플리케이션 또는 웹페이지만 클라이언트 애플리케이션의 일부로 제공하려는 경우 WebView를 사용하면

developer.android.com

 

 

 

Splash 이후 뭔가 홍보나 광고 가이드 화면을 ViewPager를 이용하여 Fragment를 연결시켜 스와이프 제스처가 가능한 화면을 만들어 볼 거다. 그리고 스킵과 메인화면으로 넘어가는 버튼을 만들었다. 생각해보면 엄청 많이 필요한 것 같아서 적어봤다.

 

1. 우선 화면에 사용할 이미지를 먼저 drawable 폴더에 넣어준다.

(나는 화면 구분을 위해 대충 3개 만들었다.)


2. 처음 생성된 main 제외하고 fragment 3개 정도만 만들자. 이미지 참조


3. Fragment는 이미지 뷰와 텍스트뷰 또는 버튼뷰를 배치한다. Activity는 ViewPager2를 배치한다.

 

fragment_guide1.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".GuideFragment1">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent">

        <ImageView
            android:id="@+id/iv_guide1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@+id/tv_skip1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.522"
            app:srcCompat="@drawable/img_guide1"
            tools:ignore="ContentDescription" />

        <TextView
            android:id="@+id/tv_skip1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="56dp"
            android:text="건너뛰기 >"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>

fragment_guide2.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".GuideFragment2">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent">

        <ImageView
            android:id="@+id/iv_guide2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@+id/tv_skip2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.522"
            app:srcCompat="@drawable/img_guide2"
            tools:ignore="ContentDescription" />
        <TextView
            android:id="@+id/tv_skip2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="56dp"
            android:text="건너뛰기 >"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>

fragment_ad1.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".AdFragment1">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent">

        <ImageView
            android:id="@+id/iv_ad1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toTopOf="@+id/btn_skip3"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@drawable/img_ad1" />

        <Button
            android:id="@+id/btn_skip3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dp"
            android:text="시작하기 >"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>

프리뷰로 본 Fragment 화면이다. 

activity_guide.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".GuideActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/vp_guide"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

</androidx.constraintlayout.widget.ConstraintLayout>

 


3. ViewPager의 Adapter를 만들어준다.

ViewPagerAdapter.java

package com.saii.viewpager2_guide;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;

class ViewPagerAdapter extends FragmentStateAdapter {

   public int mCount;
   public ViewPagerAdapter(FragmentActivity fa, int count) {
      super(fa);
      mCount = count;
   }

   public Fragment createFragment(int position) {
      int index = getRealPosition(position);
      if(index==0) return new GuideFragment1();
      else if(index==1) return new GuideFragment2();
      else return new AdFragment1();
   }
   @Override
   public int getItemCount() {
      return 3;
   }
   public int getRealPosition(int position) { return position % mCount; }

}

4. MainActivity.java에서 ViewPager와 Adapter를 연결해준다.

MainActivity.java

package com.saii.viewpager2_guide;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private ViewPager2 mPager;
    private FragmentStateAdapter pagerAdapter;
    private final int num_page = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPager = findViewById(R.id.vp_guide);
        pagerAdapter = new ViewPagerAdapter(this, num_page);
        mPager.setAdapter(pagerAdapter);

        mPager.setCurrentItem(1); //시작 지점
        mPager.setOffscreenPageLimit(num_page); //최대 페이지 수

        mPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                if (positionOffsetPixels == 0) {
                    mPager.setCurrentItem(position);
                }
            }

            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
            }
        });
    }
}

5. 각 Fragment에 이벤트를 정의합니다. Fragment에는 메인 화면으로 갈 수 있는 이벤트를 코딩했습니다. 클릭 이벤트를 커스텀 하고 싶다면 onClick 안에 다른 코딩을 하시면 됩니다. 간혹 Fragment에서 뷰가 인식이 안된다는 사람이 있는데 그 부분은 나중에 Fragment를 참조하면 될 것 같다. 

GuideFragment1.java

package com.saii.viewpager2_guide;

import android.content.Intent;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


public class GuideFragment1 extends Fragment {

    private TextView tvSkip1;
    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_guide1, container, false);

        tvSkip1 = view.findViewById(R.id.tv_skip1);
        tvSkip1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                getActivity().finish();
            }
        });

        return view;
    }
}

GuideFragment2.java

package com.saii.viewpager2_guide;

import android.content.Intent;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class GuideFragment2 extends Fragment {

    private TextView tvSkip2;
    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_guide2, container, false);

        tvSkip2 = view.findViewById(R.id.tv_skip2);
        tvSkip2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                getActivity().finish();
            }
        });

        return view;
    }
}

AdFragment1.java

package com.saii.viewpager2_guide;

import android.content.Intent;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


public class AdFragment1 extends Fragment {

    private Button btnSkip3;
    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_ad1, container, false);

        btnSkip3 = view.findViewById(R.id.btn_skip3);
        btnSkip3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(intent);
                getActivity().finish();
            }
        });
        return view;
    }
}

 

 

참조

https://github.com/saii42/android/tree/main/example/Splash

 

GitHub - saii42/android: android

android. Contribute to saii42/android development by creating an account on GitHub.

github.com

 

어플에 시작화면을 해볼 것이다. 나는 이미지 작업이 안되니 간단하게 해볼 것이다. 

안드로이드 12 에서 Splash screen(windowSplashScreenBackground)를 해볼 예정이다.

 

Splash Activity를 Delay 하는 방식이다. (Delay를 하지않아도 Splash가 가능하다.)

 

1. Splash로 사용할 이미지를 drawable 폴더에 추가한다.


2. Splash , Main 화면을 만든다.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_splash.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SplashActivity">

</androidx.constraintlayout.widget.ConstraintLayout>


3. 화면을 추가했으니 manifest에 수정해줘야한다.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.saii.splash">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".SplashActivity"
            android:theme="@style/SplashTheme"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity"
            android:exported="true">
        </activity>
    </application>
</manifest>

4. 스타일에 테마를 추가한다.

style.xml

<resources>
... 
    <style name="SplashTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowBackground">@drawable/xxx</item> //xxx <= drawable 폴더에 추가한 이미지 이름
    </style>
</resources>

5. java 파일에 delay 코드만 추가하면 된다.

SplashActvity.java

package com.saii.splash;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        gotoMain(1);  // 파라미터 만큼 delay가 된다.

    }

    private void gotoMain(int sec) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, 1000 * sec);
    }
}

 

 


참조

https://github.com/saii42/android/tree/main/example/Splash

 

GitHub - saii42/android: android

android. Contribute to saii42/android development by creating an account on GitHub.

github.com

https://developer.android.com/guide/topics/ui/splash-screen#java

 

Splash screens  |  Android Developers

Splash screens Important: If you have previously implemented a custom splash screen in Android 11 or lower, you'll need to migrate your app to the SplashScreen API to ensure that it displays correctly in Android 12 and higher. For instructions, see Migrate

developer.android.com

 

Default interface methods are only supported starting with Android N (--min-api 24): androidx.lifecycle.Lifecycle androidx.lifecycle.LifecycleRegistryOwner.getLifecycle()

 

아래처럼 해주면 해결된다.

 

Gradle Scripts > build.gradle ( Module:app )

android	{
	...
    compileOptions {
    	sourceCompatibility JavaVersion.VERSION_1_8
    	targetCompatibility JavaVersion.VERSION_1_8
	}
}

1. 인터넷을 연결되어야 하는 경우 manifest에서 internet 권한을 추가해 줘야한다.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.saii.webview">

    <application> ...
    </application>
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>

 


2. assests 폴더를 생성한다.

New > Folder > Assets Folder 아래 이미지 참조.


3. HTML은 할 줄 몰라서 간단하게 만들었습니다.

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Saii WebView Example</title>
</head>

<script type="text/javascript">
        function showAndroidToast(toast) {
           var word = document.createElement('div');
           word.textContent = Saii.showToast(toast);
          document.body.append(word);
        }
</script>

	<body>
		<h1 id="webview-example">Saii WebView - Example</h1>

    	<input id="keyword" type="text" placeholder="keyword">
    	<br>
    	<button type="submit" onClick="showAndroidToast(keyword.value)">Submit</button>
	</body>
</html>

4. 메인 화면에 WebView 하나를 배치한다.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/wv_main"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp" />
</androidx.constraintlayout.widget.ConstraintLayout>


5. 마지막으로 WebView를 Html 또는 다른 웹 페이지와 연결을 시켜준다.

MainActvity.java

package com.saii.webview;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = (WebView) findViewById(R.id.wv_main);

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        //mWebView.loadUrl("https://saii42.tistory.com/97");
        mWebView.loadUrl("file:///android_asset/index.html");
    }
}

 

참고

https://github.com/saii42/android/tree/main/example/WebView

 

GitHub - saii42/android: android

android. Contribute to saii42/android development by creating an account on GitHub.

github.com

 

인스턴스 삭제가 굉장히 귀찮다.

 

삭제하려는 인스턴스를 클릭 후 오른쪽 상단에 인스턴스 상태를 클릭 후 인스턴스 종료 버튼을 클릭한다.

 

그러면 EC2 상태가 종료 중 > 종료됨으로 변경됩니다. 그러면 다시 한번 눌러주면 삭제 완료

 

목록에서 삭제는 조금 더 걸립니다.

 

'IT > AWS' 카테고리의 다른 글

[AWS EC2] 탄력적 IP 주소 추가 및 삭제  (0) 2022.03.24
[AWS CLI] 버킷 다운로드  (0) 2022.03.23
[AWS CLI] CLI 계정 설정하기 - AWS Configure  (0) 2022.03.23
[AWS IAM] IAM  (0) 2022.03.23
[AWS CLI] Windows 환경에서 AWS CLI 설치  (0) 2022.03.23

EC2를 사용하려면 외부에서 사용할 IP가 필요하다. 그게 탄력적 IP를 추가하여서 EC2와 연결해주면 된다.

 

1. 추가

 

EC2 콘솔에서 왼쪽 탭에 네트워크 및 보안 > 탄력적 IP 클릭

화면에서 오른쪽 위에 주황색 버튼으로 탄력적 IP 주소 할당 버튼을 누르면 된다.

아래의 이미지를 참고하면 된다.

 

2. 삭제

삭제하려는 IP 주소를 클릭하고 작업 버튼 누르면 탄력적 IP 주소 릴리즈를 누르면 된다.

 

3. 인스턴스 연결

할당받은 주소를 누르면 상세정보가 나온다. 오른쪽 위 주황색 버튼으로 탄력적 IP 주소 연결 누른다.

인스턴스를 입력해주거나 검색을 해서 선택을 하고 연결 버튼을 누르면 끝이다.

EC2에서도 연결할 수 있다. < 이부분은 EC2에서 따로 작성함.

'IT > AWS' 카테고리의 다른 글

[AWS EC2] 인스턴스 삭제  (0) 2022.03.24
[AWS CLI] 버킷 다운로드  (0) 2022.03.23
[AWS CLI] CLI 계정 설정하기 - AWS Configure  (0) 2022.03.23
[AWS IAM] IAM  (0) 2022.03.23
[AWS CLI] Windows 환경에서 AWS CLI 설치  (0) 2022.03.23

콘솔에서 다운로드 하려고 했는데 폴더로는 다운로드가 안되어 CLI를 사용하여 버킷을 다운로드 해보는 방법을 포스팅해보았다. 생각보다 어렵지않다. 리눅스 명령어가 가능하다.

 

아래처럼 aws s3 명령어 URL 해주면됩니다.

aws s3 sync s3://버킷/객체 ./저장하려는 폴더명
aws s3 sync s3://Test ./TEST

 

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/accessing-an-object.html

 

3단계: 객체 다운로드 - Amazon Simple Storage Service

3단계: 객체 다운로드 버킷에 객체를 업로드한 후에는 객체에 대한 정보를 보고, 로컬 컴퓨터로 객체를 다운로드할 수 있습니다. S3 콘솔 사용 이 단원에서는 Amazon S3 콘솔을 사용하여 미리 서명

docs.aws.amazon.com

 

'IT > AWS' 카테고리의 다른 글

[AWS EC2] 인스턴스 삭제  (0) 2022.03.24
[AWS EC2] 탄력적 IP 주소 추가 및 삭제  (0) 2022.03.24
[AWS CLI] CLI 계정 설정하기 - AWS Configure  (0) 2022.03.23
[AWS IAM] IAM  (0) 2022.03.23
[AWS CLI] Windows 환경에서 AWS CLI 설치  (0) 2022.03.23

+ Recent posts